http://acm.hdu.edu.cn/showproblem.php?pid=5012
1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 5 6 4 3 1 2 3 4 5 6 1 4 2 5 3 6
0 3 -1
#include <stdio.h> #include <string.h> #include <iostream> #include <math.h> #include <queue> #include <stack> #include <vector> #include <algorithm> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int N=10005; bool v[7][7][7][7][7][7]; struct note { int a1,a2,a3,a4,a5,a6; }z; note L(note x) { note y; y.a2=x.a5; y.a6=x.a2; y.a1=x.a6; y.a5=x.a1; y.a3=x.a3; y.a4=x.a4; return y; } note R(note x) { note y; y.a5=x.a2; y.a2=x.a6; y.a6=x.a1; y.a1=x.a5; y.a3=x.a3; y.a4=x.a4; return y; } note F(note x) { note y; y.a2=x.a3; y.a4=x.a2; y.a1=x.a4; y.a3=x.a1; y.a5=x.a5; y.a6=x.a6; return y; } note B(note x) { note y; y.a3=x.a2; y.a2=x.a4; y.a4=x.a1; y.a1=x.a3; y.a5=x.a5; y.a6=x.a6; return y; } bool judge(note x) { //printf("5555\n"); // printf("%d %d %d %d %d %d\n",x.a1,x.a2,x.a3,x.a4,x.a5,x.a6); if(v[x.a1][x.a2][x.a3][x.a4][x.a5][x.a6]==0) return true; return false; } int bfs(note a) { queue< pair<note,int> > q; q.push(make_pair(a,0)); while(!q.empty()) { note x=q.front().first; int ans=q.front().second; q.pop(); if(x.a1==z.a1&&x.a3==z.a3&&x.a5==z.a5&&x.a2==z.a2&&x.a4==z.a4&&x.a6==z.a6) return ans; note y=L(x); if(judge(y)) { //printf("888\n"); v[y.a1][y.a2][y.a3][y.a4][y.a5][y.a6]=1; q.push(make_pair(y,ans+1)); } y=R(x); if(judge(y)) { v[y.a1][y.a2][y.a3][y.a4][y.a5][y.a6]=1; q.push(make_pair(y,ans+1)); } y=F(x); if(judge(y)) { v[y.a1][y.a2][y.a3][y.a4][y.a5][y.a6]=1; q.push(make_pair(y,ans+1)); } y=B(x); if(judge(y)) { v[y.a1][y.a2][y.a3][y.a4][y.a5][y.a6]=1; q.push(make_pair(y,ans+1)); } } return -1; } int main() { note x; while(~scanf("%d",&x.a1)) { scanf("%d%d%d%d%d",&x.a2,&x.a3,&x.a4,&x.a5,&x.a6); scanf("%d%d%d%d%d%d",&z.a1,&z.a2,&z.a3,&z.a4,&z.a5,&z.a6); memset(v,false,sizeof(v)); printf("%d\n",bfs(x)); } return 0; }