2014 网选 5012 Dice(bfs模板)

  1 /*
  2     题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同!
  3     问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同!
  4
  5     思路:很直白的bfs,将每一种状态对应一个数字,保证这种状态不会重新加入队列中!
  6 */
  7 #include<iostream>
  8 #include<cstdio>
  9 #include<cstring>
 10 #include<algorithm>
 11 #include<queue>
 12 using namespace std;
 13
 14 int a[7], ss;
 15 int vis[654330];
 16
 17 struct node{
 18     int k[7];
 19     node(){}
 20     node(int a1, int a2, int a3, int a4, int a5, int a6){
 21         k[1]=a1;
 22         k[2]=a2;
 23         k[3]=a3;
 24         k[4]=a4;
 25         k[5]=a5;
 26         k[6]=a6;
 27     }
 28     int step;
 29 };
 30
 31 queue<node>q;
 32
 33
 34 int sum(node x){
 35     int s=0;
 36     for(int i=1; i<=6; ++i)
 37        s= s*10 + x.k[i];
 38     return s;
 39 }
 40
 41 bool bfs(){
 42     while(!q.empty()) q.pop();
 43     node cur(a[1], a[2], a[3], a[4], a[5], a[6]);
 44     cur.step=0;
 45     q.push(cur);
 46     vis[sum(cur)]=1;
 47     while(!q.empty()){
 48         cur = q.front();
 49         if(sum(cur)==ss){
 50             printf("%d\n", cur.step);
 51             return true;
 52         }
 53         q.pop();
 54         node *nt = new node(cur.k[5], cur.k[6], cur.k[3], cur.k[4], cur.k[2], cur.k[1]);
 55         int v = sum(*nt);
 56         if(!vis[v]){
 57             vis[v]=1;
 58             nt->step = cur.step + 1;
 59             q.push(*nt);
 60         }
 61
 62         nt = new node(cur.k[6], cur.k[5], cur.k[3], cur.k[4], cur.k[1], cur.k[2]);
 63         v = sum(*nt);
 64         if(!vis[v]){
 65             vis[v]=1;
 66             nt->step = cur.step + 1;
 67             q.push(*nt);
 68         }
 69
 70         nt = new node(cur.k[3], cur.k[4], cur.k[2], cur.k[1], cur.k[5], cur.k[6]);
 71         v = sum(*nt);
 72         if(!vis[v]){
 73             vis[v]=1;
 74             nt->step = cur.step + 1;
 75             q.push(*nt);
 76         }
 77
 78         nt = new node(cur.k[4], cur.k[3], cur.k[1], cur.k[2], cur.k[5], cur.k[6]);
 79         v = sum(*nt);
 80         if(!vis[v]){
 81             vis[v]=1;
 82             nt->step = cur.step + 1;
 83             q.push(*nt);
 84         }
 85     }
 86     return false;
 87 }
 88
 89 int main(){
 90     while(scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])!=EOF){
 91         ss=0;
 92         for(int i=1; i<=6; ++i){
 93             int x;
 94             scanf("%d", &x);
 95             ss = ss * 10 + x;
 96         }
 97         memset(vis, 0, sizeof(vis));
 98         if(!bfs())
 99             printf("-1\n");
100     }
101     return 0;
102 }
时间: 2024-11-03 01:20:28

2014 网选 5012 Dice(bfs模板)的相关文章

2014 网选 5024 Wang Xifeng&#39;s Little Plot

题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话, 那么必须是 90度,或者没有转弯! 思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 ! step[i][j][k] 表示的是(i,j)沿着k方向一直走到头或者转弯时的最长步数! 最后枚举每一个可走点转弯为90度的路径,找到最长的长度! step[i][j][k1] + step[i][j][k2] 就是 (i, j)这个点 k1 和 k2方向构成90度! 1 #include<iostream

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor&#39;s Performance Art

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N 1000005 6 using namespace std; 7 8 int c[35]; 9 int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色,-1表示的是非纯色 10 int n, m; 11 12 void buildT(int ld, int

HDU 5012 Dice (bfs + 记忆化搜索)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5012 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 f

2014 网选 5014 Number Sequence(异或)

1 /* 2 题意:a, b两个序列,规定由[0, n]区间的数! 3 求 a[i] ^ b[i] 的和最大! 4 5 思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位 6 都是1,也就是由x位1!这样下去的到的值就是最大值! 7 8 */ 9 #include<iostream> 10 #include<cstring> 11 #include<cstdio> 12 #include<algorithm> 13 #def

2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))

//暴力,从每一行的开始处开始寻找要查询的字符 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char str[100005]; int main(){ while(gets(str)){ for(int i=0; str[i]; ++i) if(str[i]=='A'){ if(strstr(str+i, &quo

2014网选ZOJPretty Poem(暴力枚举)

/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 6 using namespace std; 7 string str; 8 char ch[55]; 9 int main(){ 10 int t; 11 scanf("%d&

2014 网选 5011 Game(Nim游戏,数学题)

/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace std; int main(){ int n, x, s; while(cin>>n){ s=0; while(n--){ cin>>x; s^=x; } if(s) cout<<"Win";//不是偶数 else cout<<"

2014 网选 上海赛区 hdu 5047 Sawtooth

题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个'M'型的折线呢?它有四条线,但是由于三个顶点的关系导致划分的平面 的数目减少了9个!所以有递推公式 f(n) = (m*m + m + 2)/2 - 9*n; m = 4*n 最后 f(n) = (8*n+1)*(n-1)+2) 由于 n<=1e12 , 所以回报 long long!那么对于大于

HDU5012:Dice(bfs模板)

http://acm.hdu.edu.cn/showproblem.php?pid=5012 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,