zoj 2416/hdu 1195 Open the Lock BFS基础

很基础的BFS,不过由于自己太菜鸟,问了青蛙牛才明白

**********************************************

对于首状态 1234
他的下一个状态可以是
2234 1334 1244 1235
9234 1134 1224 1233
2134 1324 1243
把这些状态都放到队列里面去,并且把他们的步数记录为1

然后在队列里面拉出头状态,2234
继续枚举没有访问过的下一个状态,放到队列里面,并且标记他们的步数为2

直到找到一个终结的状态,输出它的步数。
**********************************************

尽管ac了,不过时间不太理想,几百ms。。。囧

 

#include<iostream> using namespace std; #include<string> #include<queue> string s1,s2; bool hash[10010]; struct node { string s; int step; }; int change(string s) { return (s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+s[3]-'0'; } string add(string s,int i) { if(s[i]=='9') s[i]='1'; else s[i]=s[i]+1; return s; } string sub(string s,int i) { if(s[i]=='1') s[i]='9'; else s[i]=s[i]-1;//把‘-’写成‘+’,wa死我啦!!! return s; } string swap(string s,int i) { char c; c=s[i]; s[i]=s[i+1]; s[i+1]=c; return s; } void dfs() { int i,d; queue<node> q; node a,b; while(!q.empty())//清空之前的队列 q.pop(); a.s=s1,a.step=0; q.push(a); while(!q.empty()) { a=q.front(); q.pop(); if(a.s==s2) { cout<<a.step<<endl; return ; }d=change(a.s); if(hash[d]) continue; hash[d]=true; for(i=0;i<4;i++) { if(i!=3) { b.s=swap(a.s,i); b.step=a.step+1; if(b.s==s2) { cout<<b.step<<endl; return ; } if(!hash[change(b.s)]) q.push(b); } b.s=add(a.s,i); b.step=a.step+1; if(b.s==s2) { cout<<b.step<<endl; return ; } if(!hash[change(b.s)]) q.push(b); b.s=sub(a.s,i); b.step=a.step+1; if(b.s==s2) { cout<<b.step<<endl; return ; } if(!hash[change(b.s)]) q.push(b); } } } int main() { //freopen("a.txt","r",stdin); int Case; while(cin>>Case) { while(Case--) { memset(hash,false,sizeof(hash)); cin>>s1>>s2; dfs(); } } return 0; }

 

你可能感兴趣的:(zoj 2416/hdu 1195 Open the Lock BFS基础)