题解 P1379 八数码难题
Posted _ZZH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P1379 八数码难题相关的知识,希望对你有一定的参考价值。
用STL中的queue,map,string写了个广搜,用一个string保存状态(见代码)注:STL比较慢,可以做一些优化(或者开O2)
#include<iostream> #include<cstdio> #include<string> #include<queue> #include<map> using namespace std; string start; map<string,long long>m;//保存这个状态需要几步到达 map<string,bool>b;//判重,记录状态是否经过 queue<string>q;//队列 int main() { cin>>start; q.push(start); b[start]=1; m[start]=0;//处理初始状态 while(!q.empty()) { string cnt=q.front();q.pop();//取队首 if(cnt=="123804765")break;//目标状态(终止条件) string s2="0"; int position=cnt.find(s2,0);//查找0的位置 string s3=cnt;//见下文 if(position-3>=0) { swap(s3[position],s3[position-3]);/*骚操作,可以交换string中两个位置的值(知道s3干什么的了吧……)*/ if(!b[s3]) { m[s3]=m[cnt]+1; q.push(s3); b[s3]=1; }//入队 s3=cnt;//别忘了改回来 }//往上跑 if(position-1>=0&&(position)%3!=0)/*往左跑,注意判越界*/ { swap(s3[position],s3[position-1]); if(!b[s3]) { m[s3]=m[cnt]+1; q.push(s3); b[s3]=1; } s3=cnt; } if(position+1<cnt.size()&&(position+1)%3!=0)//往右跑 { swap(s3[position],s3[position+1]); if(!b[s3]) { m[s3]=m[cnt]+1; q.push(s3); b[s3]=1; } s3=cnt; } if(position+3<cnt.size())//往下跑 { swap(s3[position],s3[position+3]); if(!b[s3]) { m[s3]=m[cnt]+1; q.push(s3); b[s3]=1; } s3=cnt; } } printf("%d",m["123804765"]);//因为保证有解,所以直接输出答案。 }
以上是关于题解 P1379 八数码难题的主要内容,如果未能解决你的问题,请参考以下文章