HDU - 5012 Dice BFS

来源:互联网 发布:智慧城市数据库 编辑:程序博客网 时间:2024/06/04 17:47

题目大意:给出两个色子,只能进行四种操作,左转,右转,上转,下转,问能否经过旋转使两个色子的各面都相同

解题思路:直接暴力,用vis数组表示是否搜索过,这种解法接近1S,有点悬

#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#define maxn 700000using namespace std;const int Z[4][6] = {{2,3,1,0,4,5},{3,2,0,1,4,5},{5,4,2,3,0,1},{4,5,2,3,1,0}};struct Dice{int statu[6], time;}D;int A[6], B[6], vis[maxn], End, ans;bool solve() {queue<Dice> q;for(int i = 0; i < 6; i++)D.statu[i] = B[i];D.time = 0;q.push(D);while(!q.empty()) {Dice tmp = q.front();q.pop();int num = 0;for(int i = 0; i < 6; i++)num = num * 10 + tmp.statu[i];if(num == End) {ans = tmp.time;return true;}for(int i = 0; i < 4; i++) {int t = 0;Dice temp;for(int j = 0; j < 6; j++) {t = t * 10 + tmp.statu[Z[i][j]];temp.statu[j] = tmp.statu[Z[i][j]];}if(!vis[t]) {temp.time = tmp.time + 1;q.push(temp);vis[t] = 1;}}}return false;}int main() {while(scanf("%d", &A[0]) == 1) {End = A[0];for(int i = 1; i < 6; i++) {scanf("%d", &A[i]);End = End * 10 + A[i];}for(int i = 0; i < 6; i++)scanf("%d", &B[i]);memset(vis,0,sizeof(vis));if(solve()) printf("%d\n",ans);elseprintf("-1\n");}return 0;}
另一种解法是推出最多旋转几次可以得到所需的情况,可以推出最多旋转5次


#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int Z[4][6] = {{2,3,1,0,4,5},{3,2,0,1,4,5},{5,4,2,3,0,1},{4,5,2,3,1,0}};struct Dice{int statu[6], time;}D;int A[6], B[6],End, ans;bool solve() {queue<Dice> q;for(int i = 0; i < 6; i++)D.statu[i] = B[i];D.time = 0;q.push(D);while(!q.empty()) {Dice tmp = q.front();q.pop();int num = 0;for(int i = 0; i < 6; i++)num = num * 10 + tmp.statu[i];if(num == End) {ans = tmp.time;return true;}for(int i = 0; i < 4; i++) {int t = 0;Dice temp;for(int j = 0; j < 6; j++) {t = t * 10 + tmp.statu[Z[i][j]];temp.statu[j] = tmp.statu[Z[i][j]];}temp.time = tmp.time + 1;if(temp.time >= 6)return false;q.push(temp);}}return false;}int main() {while(scanf("%d", &A[0]) == 1) {End = A[0];for(int i = 1; i < 6; i++) {scanf("%d", &A[i]);End = End * 10 + A[i];}for(int i = 0; i < 6; i++)scanf("%d", &B[i]);if(solve()) printf("%d\n",ans);elseprintf("-1\n");}return 0;}


0 0
原创粉丝点击