2014ACMICPC西安网赛1006

题意:给你一个骰子的初始状态和可以进行的四种操作,求从初始状态到目标状态的最少操作次数

题目本身很简单,bfs即可。但是因为骰子有六个面,搜索判重和记录状态比较麻烦。这时候就需要神器STL了。

  1 #include <iostream>
  2 #include <map>
  3 #include <queue>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <cstdio>
  7 #include <cstring>
  8 using namespace std;
  9
 10 struct node
 11 {
 12     vector<int> seq;
 13     int step;
 14     node(vector<int> x,int m):seq(x),step(m)
 15     {}
 16 };
 17
 18 int a[10],b[10];
 19 vector<int> A;
 20 vector<int> y;
 21 //queue<node> Q;
 22 map<vector<int>,int> M;
 23 bool ok;
 24
 25 void writeln(vector<int> x,node y)
 26 {
 27     for (int i=0;i<6;i++)
 28         cout<<x[i]<<" ";
 29     cout<<" - "<<y.step<<endl;
 30 }
 31
 32 bool satisfy()
 33 {
 34     for (int i=0;i<6;i++)
 35         if (y[i]!=b[i])     return false;
 36     ok=true;
 37     return true;
 38 }
 39
 40 void lft()
 41 {
 42     vector<int> t;
 43     t=y;
 44     y[2]=t[0];    y[3]=t[1];    y[1]=t[2];
 45     y[0]=t[3];    y[4]=t[4];    y[5]=t[5];
 46 }
 47 void rht()
 48 {
 49     vector<int> t;
 50     t=y;
 51     y[3]=t[0];    y[2]=t[1];    y[0]=t[2];
 52     y[1]=t[3];    y[4]=t[4];    y[5]=t[5];
 53 }
 54 void fnt()
 55 {
 56     vector<int> t;
 57     t=y;
 58     y[4]=t[0];    y[5]=t[1];    y[2]=t[2];
 59     y[3]=t[3];    y[1]=t[4];    y[0]=t[5];
 60 }
 61 void bak()
 62 {
 63     vector<int> t;
 64     t=y;
 65     y[5]=t[0];    y[4]=t[1];    y[2]=t[2];
 66     y[3]=t[3];    y[0]=t[4];    y[1]=t[5];
 67 }
 68
 69 bool same()
 70 {
 71     for (int i=0;i<6;i++)
 72         if (a[i]!=b[i])     return false;
 73     return true;
 74 }
 75
 76 int main()
 77 {
 78     //freopen("in.txt","r",stdin);
 79
 80     while (cin>>a[0])
 81     {
 82         A.clear();
 83         M.clear();
 84         //Q.clear();
 85         queue <node> Q;
 86         ok=false;
 87
 88         A.push_back(a[0]);
 89         for (int i=1;i<6;i++)
 90         {
 91             cin>>a[i];
 92             A.push_back(a[i]);
 93         }
 94         for (int i=0;i<6;i++)
 95             cin>>b[i];
 96         if (same())
 97         {
 98             cout<<0<<endl;
 99             continue;
100         }
101
102         Q.push(node(A,1));
103         //int nm=1;
104         M.insert(pair<vector<int>,int>(A,1));
105
106         while (!Q.empty())
107         {
108             node tmp=Q.front();
109             Q.pop();
110             int st=tmp.step;
111             st++;
112             y=tmp.seq;
113             //writeln(y,tmp); ////////
114             if (satisfy())
115             {
116                 cout<<st-2<<endl;
117                 break;
118             }
119             /*
120             if (st>55)
121             {
122                 cout<<-1<<endl;
123                 break;
124             }*/
125             for (int tm=1;tm<=4;tm++)
126             {
127                 if (tm==1)
128                 {
129                     y=tmp.seq;
130                     lft();
131                     if (!M.count(y))
132                     {
133                         M.insert(pair<vector<int>,int>(y,1));
134                         Q.push(node(y,st));
135                     }
136                 }
137                 if (tm==2)
138                 {
139                     y=tmp.seq;
140                     rht();
141                     if (!M.count(y))
142                     {
143                         M.insert(pair<vector<int>,int>(y,1));
144                         Q.push(node(y,st));
145                     }
146                 }
147                 if (tm==3)
148                 {
149                     y=tmp.seq;
150                     fnt();
151                     if (!M.count(y))
152                     {
153                         M.insert(pair<vector<int>,int>(y,1));
154                         Q.push(node(y,st));
155                     }
156                 }
157                 if (tm==4)
158                 {
159                     y=tmp.seq;
160                     bak();
161                     if (!M.count(y))
162                     {
163                         M.insert(pair<vector<int>,int>(y,1));
164                         Q.push(node(y,st));
165                     }
166                 }
167             }
168         }
169         if (!ok)    cout<<-1<<endl;
170     }
171
172 }

本题中用到的操作:

用map作为哈希表判重:

map<vector<int>,int>,这样就把一个vector容器和一个整数关联起来了。

map对象的.count(x)函数:返回x在哈希表中的出现次数,未出现则返回0。用这个函数就可以判重了。

queue:队列

注意queue和stack没有.clear()函数,所以用完之后没法清空,只能建一个新的(三次都WA到这里了,对拍时才发现T^T)

还有结构体声明里面的node(vector<int> x,int m)那个东西是结构体构造函数,neopenx大神教的,可以避免代码太屎

附上neopenx大神的AC代码,Orz

  1 #include "cstdio"
  2 #include "queue"
  3 #include "vector"
  4 #include "map"
  5 using namespace std;
  6 int a[7],b[7];
  7 vector<int> B;
  8 map<vector<int>,int> HASH;
  9 bool ok=false;
 10 struct node
 11 {
 12     vector<int> X;
 13     int num;
 14     node(vector<int> x,int n): X(x),num(n) {}
 15 };
 16 void bfs()
 17 {
 18     vector<int> A;
 19     for(int i=1;i<=6;i++) A.push_back(a[i]);
 20     if(A==B) {printf("%d\n",0);ok=true;return;}
 21     queue<node> Q;Q.push(node(A,0));
 22     while(!Q.empty())
 23     {
 24         node x=Q.front();Q.pop();
 25         //if(x.num>=8) continue; //没必要对dep剪枝了,目测数据在dep=4的时候,就能全部被hash掉
 26         vector<int> tt=x.X;
 27         for(int s=0;s<4;s++)
 28         {
 29             int flag=x.num;
 30             if(s==0)
 31             {
 32                 int a=tt[0],b=tt[1],c=tt[2],d=tt[3];
 33                 vector<int> C;
 34                 C.push_back(c);C.push_back(d);C.push_back(b);C.push_back(a);
 35                 C.push_back(tt[4]);C.push_back(tt[5]);
 36                 if(C==B)
 37                 {
 38                     printf("%d\n",++flag);
 39                     ok=true;
 40                     return;
 41                 }
 42                 else
 43                 {
 44                     if(HASH.count(C)) continue;
 45                     else
 46                     {
 47                        HASH[C]=1;
 48                        Q.push(node(C,++flag));
 49                     }
 50                 }
 51             }
 52             if(s==1)
 53             {
 54                 int a=tt[0],b=tt[1],c=tt[2],d=tt[3];
 55                 vector<int> C;
 56                 C.push_back(d);C.push_back(c);C.push_back(a);C.push_back(b);
 57                 C.push_back(tt[4]);C.push_back(tt[5]);
 58                  if(C==B)
 59                 {
 60                     printf("%d\n",++flag);
 61                     ok=true;
 62                     return;
 63                 }
 64                 else
 65                 {
 66                     if(HASH.count(C)) continue;
 67                     else
 68                     {
 69                        HASH[C]=1;
 70                        Q.push(node(C,++flag));
 71                     }
 72                 }
 73             }
 74             if(s==2)
 75             {
 76                 int a=tt[0],b=tt[1],c=tt[4],d=tt[5];
 77                 vector<int> C;
 78                 C.push_back(c);C.push_back(d);
 79                 C.push_back(tt[2]);C.push_back(tt[3]);
 80                 C.push_back(b);C.push_back(a);
 81                  if(C==B)
 82                 {
 83                     printf("%d\n",++flag);
 84                     ok=true;
 85                     return;
 86                 }
 87                 else
 88                 {
 89                     if(HASH.count(C)) continue;
 90                     else
 91                     {
 92                        HASH[C]=1;
 93                        Q.push(node(C,++flag));
 94                     }
 95                 }
 96             }
 97             if(s==3)
 98             {
 99                 int a=tt[0],b=tt[1],c=tt[4],d=tt[5];
100                 vector<int> C;
101                 C.push_back(d);C.push_back(c);
102                 C.push_back(tt[2]);C.push_back(tt[3]);
103                 C.push_back(a);C.push_back(b);
104                 if(C==B)
105                 {
106                     printf("%d\n",++flag);
107                     ok=true;
108                     return;
109                 }
110                 else
111                 {
112                     if(HASH.count(C)) continue;
113                     else
114                     {
115                        HASH[C]=1;
116                        Q.push(node(C,++flag));
117                     }
118                 }
119             }
120         }
121     }
122 }
123 int main()
124 {
125     //freopen("in.txt","r",stdin);
126     while(~scanf("%d",&a[1]))
127     {
128         for(int i=2;i<=6;i++)
129             scanf("%d",&a[i]);
130         for(int i=1;i<=6;i++)
131         {
132             scanf("%d",&b[i]);
133             B.push_back(b[i]);
134         }
135         bfs();
136         if(!ok) printf("-1\n");
137         B.clear();
138         HASH.clear();
139         ok=false;
140     }
141 }

时间: 2024-11-05 16:04:40

2014ACMICPC西安网赛1006的相关文章

ACM学习历程—HDU 5012 Dice(ACM西安网赛)(bfs)

Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number was written. Consider a1.a2,a3,a4,a5,a6 to be numbers written on top face, bottom face, left face, right face, front face and back face of dice A.

HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块. 输入是有n个“M",现在已经推出这个公式应该是8 * n^2 - 7 * n + 1,但是这个n的范围达到了10^12次方,只要平方一次就超出long long  的范围了,怎么办呢,用大数? 都试过了,很奇怪,会超时,按照估算的话感觉不会,可能是中间结果比较大吧,这个还在思考,但是10^12平方一次乘以八也只达到了10^25次方

ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)

Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● a i ∈ [0,n] ● a i ≠ a j( i ≠ j ) For sequence a and sequence b, the integrating degree t is defined as follows(“?” denotes exclus

ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)

---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance between the original point (0,0,0) and points on the ellipsoid. The distance between two points (x 1,y 1,z 1) and (x 2,y 2,z 2) is defined as  Input

14西安区域赛总结帖

14西安区域赛总结帖 ACM 第一次打区域赛,终于可以好好地写一篇总结帖了. 总结帖=口水帖?差不多吧.(在我离开的时候发生了些事情,我现在心情不是很好,我就随便水水吧) 文章结构就用总分总吧. 西安之行在各个方面让我涨了不少姿势. 这次的比赛个人感觉还不错,至少没有发挥失常,而且顺利拿到了铜牌.(感动ing,其实已经做好了打铁的准备,多谢学妈.表妹.zlx.wjx等童鞋的赛前加的buff) 出发前. 比赛前这阶段是非常忙的,要应付各种事情.但是我还是腾出了很多时间来准备比赛,说是准备其实是临时

ACM学习历程—HDU 5023 A Corrupt Mayor&#39;s Performance Art(广州赛区网赛)(线段树)

Problem Description Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless painting at a high price to someone who wants to bribe him/her on an auction, this seemed a safe way for mayor X to make money. Becaus

大连网络赛 1006 Football Games

1 //大连网络赛 1006 2 // 吐槽:数据比较水.下面代码可以AC 3 // 但是正解好像是:排序后,前i项的和大于等于i*(i-1) 4 5 #include <bits/stdc++.h> 6 using namespace std; 7 #define LL long long 8 typedef pair<int,int> pii; 9 const double inf = 123456789012345.0; 10 const LL MOD =100000000L

hdu5017:补题系列之西安网络赛1011

补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为min(a,b,c) 所以我们需要把原方程化为标准型. 这时候线代就排上用场了,注意到原方程是一个二次型. 化为标准型 1/(k1)*x^2+1/(k2)*y^2+1/(k3)*z^2=1 后  min(k1,k2,k3)即为答案 而这里的1/k1,1/k2,1/k3 就是二次型矩阵的特征值 如何求特

2014ACM-ICPC 西安赛区总结

万万没想到,打铁了.以前一直觉得拿铁咖啡的梗是很好笑的,然后有一天这杯咖啡自己喝下去了,就会发现心里真的被梗住了. 复旦的题其实我是有预料到的,前年的复旦题三题从金区到铜区都有,但是从去年的南京赛区开始,数学之风感觉就没有那么盛行了,出题人也说了出的题都是比较可做的,去年南京赛区就是因为知识点不足,始终出不了轮廓线的dp或者是那道树分治的题,所以没有能拿到银.今年我想着复旦出题的风格应该是变了吧,我们队只要带齐知识面去做应该就没问题了.但是最后还是卡在了两题上. 现场赛的经历是这样的,一开场我负