- 八数码问题
- 2017-07-05 16:48:32 @
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100010
using namespace std;
int map[3][3],x,y,head,tail;
int _x[4]={0,1,0,-1};
int _y[4]={1,0,-1,0};
struct node {
int m[3][3];
};
node e[MAXN];
char s[10];
int step[MAXN];
bool _hash[3733800],flag;
inline void _pre() {
string ss="123804765";
for(int i=0;i<9;i++) {
map[x][y]=ss[i]-48;
y++;
if(y==3) x++,y=0;
}
x=0;y=0;
return;
}
inline bool __hash() {
int _Inr=0,k=1;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++) {
_Inr+=e[tail].m[i][j]*k;
k*=7;
}
_Inr%=373899;
if(!_hash[_Inr]) {
_hash[_Inr]=true;
return true;
}
return false;
}
inline bool pd(int i,int j) {
return i>=0&&j>=0&&i<3&&j<3;
}
inline bool check() {
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(e[tail].m[i][j]!=map[i][j]) return false;
return true;
}
inline void move(int p,int q) {
int xx,yy;
for(int i=0;i<4;i++) {
xx=p+_x[i];
yy=q+_y[i];
if(pd(xx,yy)) {
for(int a=0;a<3;a++)
for(int b=0;b<3;b++)
e[tail].m[a][b]=e[head].m[a][b];
swap(e[tail].m[p][q],e[tail].m[xx][yy]);
step[tail]=step[head]+1;
if(check()) {
printf("%d\n",step[tail]);
flag=true;
return;
}
if(__hash()) tail++;
}
}
}
inline void search() {
while(head<tail) {
for(int i=0;i<3;i++)
for(int j=0;j<3;j++) {
if(e[head].m[i][j]==0) move(i,j);
if(flag) return;
}
head++;
}
}
int main() {
_pre();
scanf("%s",s);
for(int i=0;i<strlen(s);i++) {
e[0].m[x][y]=s[i]-48;
y++;
if(y==3) y=0,x++;
}
tail++;
search();
return 0;
}
0 条评论
目前还没有评论...