hdu1195 Open the Lock

来源:互联网 发布:js完善当当购物车页面 编辑:程序博客网 时间:2024/05/08 18:11
/*author:snowflaketime:2012.5.10desc:bfs搜索暴力求解*//*此题求解开锁的最优解,那就用BFS来求解吧*/#include <iostream>#include <queue>#include <cstring>#include <cstdio>using namespace std;typedef struct{int n[4], step;}Node;int final[4];//开锁时的四个号码bool mark[10][10][10][10];//访问状态用int bfs(Node q){int i;Node p, k;bool lock;queue<Node> Q;Q.push(q);while(!Q.empty()){p = Q.front();Q.pop();lock = true;//判断是否可以开锁for(i = 0; i < 4; i++){if(p.n[i] != final[i]){lock = false;break;}}if(lock)return p.step;//每一位试探加1操作for(i = 0; i < 4; i++){k = p;if(p.n[i] == 9)k.n[i] = 1;elsek.n[i] = p.n[i] + 1;if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]]){mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;k.step = p.step + 1;Q.push(k);}}//每一位试探减1操作for(i = 0; i < 4; i++){k = p;if(p.n[i] == 1)k.n[i] = 9;elsek.n[i] = p.n[i] - 1;if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]]){mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;k.step = p.step + 1;Q.push(k);}}//相邻交换 for(i = 0; i < 3; i++){k = p;k.n[i] = p.n[i + 1];k.n[i + 1] = p.n[i];if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]]){mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;k.step = p.step + 1;Q.push(k);}}}return -1;//这里没什么用,肯定可以开锁,执行不到这里,就是为了没有waring}int main(){int i, t;Node p;char status[2][4];scanf("%d",&t);while(t--){//当作字符串输入scanf("%s",&status[0]);scanf("%s",&status[1]);//把字符串转型for(i = 0; i < 4; i++){p.n[i] = status[0][i]-'0';final[i] = status[1][i] - '0';}p.step = 0;memset(mark, false, sizeof(mark));//初始化访问状态int s = bfs(p);printf("%d\n",s);}return 0;}

原创粉丝点击