【luogu1379】八数码难题(bfs)

来源:互联网 发布:手机如何开网店淘宝店 编辑:程序博客网 时间:2024/06/05 18:25

题目:

我是超链接

题解:

8位数判重乱搞+bfs不优化+一些奇妙的操作都在注释里。

见识到了大暴力。

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;struct hh{int n,l,step;};const int jz[9]={100000000,10000000,1000000,100000,10000,1000,100,10,1};const int c[4]={-1,3,-3,1};//一行数中可以被0换到的点 char st[12];bool ss[88888888];int n,i;int main(){scanf("%d",&n);int www=n,l=8;while (www){if (www%10==0) break;l--; www/=10;}//找到0的位置 queue<hh>q;q.push((hh){n,l,0});ss[n/10]=1;//9位数会炸,确定了前八位就可以知道第九位,所以只需8位 while (!q.empty()){hh now=q.front(); q.pop();if (now.n==123804765){printf("%d",now.step);return 0;}for (i=0;i<4;i++){int xx=now.l+c[i];//0的位置变成了? int j=now.l;//原来0的位置 if (xx<0 || xx>8) continue;if (j%3==0 && c[i]==-1) continue;//3*3的格子中已经是最左 if (j%3==2 && c[i]==1) continue;//3*3的格子中已经是最右 //举个例子,283104765 ---> 283014765 int w=(now.n/jz[xx])%10;//2831 ---> 1 //283104765 ---> 28310--->28311 ---> 283114765int www=(now.n/jz[j]+w)*jz[j]+now.n%jz[j];//283114765->2831->283->2830     14765www=www/jz[xx]/10*10*jz[xx]+www%jz[xx];//极为神奇的操作 if (!ss[www/10]){ss[www/10]=1;q.push((hh){www,xx,now.step+1});}}}}