各种搜啊。据说IDA*好用还好敲。不过暂时理解不了啊。还是老老实实宽搜吧。kuangbin的代码看着特别舒服。
#include#include #include #include #include using namespace std;const int MAXN=1000000;//最多是9!/2int fac[]={ 1,1,2,6,24,120,720,5040,40320,362880};//康拖展开判重bool vis[MAXN];//标记string path[MAXN];//记录路径int cantor(int s[])//康拖展开求该序列的hash值{ int sum=0; for(int i=0;i<9;i++) { int num=0; for(int j=i+1;j<9;j++) if(s[j] q; q.push(cur); path[aim]=""; while(!q.empty()) { cur=q.front(); q.pop(); int x=cur.loc/3; int y=cur.loc%3; for(int i=0;i<4;i++) { int tx=x+move[i][0]; int ty=y+move[i][1]; if(tx<0||tx>2||ty<0||ty>2)continue; next=cur; next.loc=tx*3+ty; next.s[cur.loc]=next.s[next.loc]; next.s[next.loc]=0; next.status=cantor(next.s); if(!vis[next.status]) { vis[next.status]=true; next.path=indexs[i]+next.path; q.push(next); path[next.status]=next.path; } } }}int main(){ char ch; Node cur; bfs(); while(cin>>ch) { if(ch=='x') {cur.s[0]=0;cur.loc=0;} else cur.s[0]=ch-'0'; for(int i=1;i<9;i++) { cin>>ch; if(ch=='x') { cur.s[i]=0; cur.loc=i; } else cur.s[i]=ch-'0'; } cur.status=cantor(cur.s); if(vis[cur.status]) { cout<<