hdu 1195 BFS

来源:互联网 发布:java并发编程实践 pdf 编辑:程序博客网 时间:2024/06/05 00:29
广搜32MS,这题比较简单,进行各种变换推状态就行了#include <iostream>#include <queue>#include <string>#include <cstring>using namespace std;typedef struct{int password[4];    //4位密码int step;            //步数}pass;int target[4];     //最终密码int T;string initpass;string finalpass;bool visited[10][10][10][10];   //标记int BFS(pass init){queue<pass> Q;Q.push(init);bool lock;pass p;while(!Q.empty()){p = Q.front();Q.pop();lock = true;for(int i = 0; i < 4; i++)   //结束条件{if(p.password[i] != target[i]){lock = false;break;}}if(lock){return p.step;}for(int i = 0; i < 4; i++)     //进行加操作{pass n;n = p;if(p.password[i] == 9){n.password[i] = 1;}else{n.password[i] = p.password[i] + 1;}if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]]){n.step = p.step + 1;visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;Q.push(n);}}for(int i = 0; i < 4; i++)   //进行减操作{pass n;n = p;if(p.password[i] == 1){n.password[i] = 9;}else{n.password[i] = p.password[i] - 1;}if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]]){n.step = p.step + 1;visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;Q.push(n);}}for(int i = 0; i < 3; i++)   //互换操作{pass n;n = p;n.password[i] = p.password[i+1];n.password[i+1] = p.password[i];if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]]){n.step = p.step + 1;visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;Q.push(n);}}}return -1;}int main(){cin>>T;while(T--){cin>>initpass;cin>>finalpass;pass first;for(int i = 0; i < 4; i++)  //将字符转化成数字{first.password[i] = initpass[i] - '0';target[i] = finalpass[i] - '0';}first.step = 0;memset(visited,0,sizeof(visited));int s = BFS(first);cout<<s<<endl;}return 0;} 

原创粉丝点击