HDU 5012 骰子旋转(DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=5012
保存骰子的状态,然后用dfs或者bfs搜索
还是再讲一下dfs
我们的目标是找一个与b相同,且转次数最少的状态
dfs就是树状图,要明确每个状态下的分支,以及边界条件
有4种变换,所以每个状态下面有四种分支,又因为骰子转4次以上的状态没有意义,所以边界条件可以是4
每个状态起始时与b判断,如果相同,则更新结果
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <cctype> #include <vector> #include <iterator> #include <set> #include <map> #include <sstream> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define pb push_back #define debug printf("!\n") #define MAXN 100000 + 10 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define pqueue priority_queue #define INF 0x3f3f3f3f int n,m; int result; int a[6],b[6]; int dice[5][6] { {0,1,2,3,4,5}, {3,2,0,1,4,5}, {2,3,1,0,4,5}, {5,4,2,3,0,1}, {4,5,2,3,1,0} }; void dfs(int cnt) { if(cnt>=5) return; int i,j,flag = 1; for(i=0;i<6;i++) { if(a[i]!=b[i]) { flag = 0; break; } } if(flag) { result = min(result,cnt); return; } //pf("cnt%d\n",cnt); int ans = -1,tmp[6]; for(i=0;i<6;i++) tmp[i] = a[i]; for(i=1;i<5;i++) { for(j=0;j<6;j++) { a[j] = tmp[dice[i][j]]; //pf("%d ",a[j]); } //blank; dfs(cnt+1); } for(i=0;i<6;i++) a[i] = tmp[i]; return; } int main() { int i,j; while(sf("%d",&a[0])!=EOF) { result = 5; for(i=1;i<6;i++) sf("%d",&a[i]); for(i=0;i<6;i++) sf("%d",&b[i]); dfs(0); if(result == 5) result = -1; pf("%d\n",result); } return 0; }
这题用bfs其实更合适