普通的bfs,hash判重,hdu上提交的时候记得改成%I64d输入输出
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define MAXN 1000007
struct node
{
int dis;
__int64 m[5][9];
int posx[5];
int posy[5];
};
queue<node> Q;
__int64 Hash[MAXN];
__int64 base[33]={1};
bool flag;
__int64 final[5][9]={{0},{0,11,12,13,14,15,16,17,0},{0,21,22,23,24,25,26,27,0},{0,31,32,33,34,35,36,37,0},{0,41,42,43,44,45,46,47,0}};
__int64 endvalue;
bool HashInsert(__int64 value)
{
int v=value%MAXN;
while(Hash[v]!=-1&&Hash[v]!=value){
v=(v+10)%MAXN;
}
if(Hash[v]==-1){
Hash[v]=value;
return true;
}
return false;
}
__int64 cal(node &tt)
{
__int64 value=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=8;j++)
{
value+=tt.m[i][j]*base[(i-1)*8+(j-1)];
}
if(value==endvalue) flag=1;
return value;
}
bool insert(node &tt)
{
__int64 value=cal(tt);
return HashInsert(value);
}
int bfs()
{
node tmp,tt;
while(!Q.empty())
{
tmp=Q.front(); Q.pop();
for(int i=1;i<=4;i++)
{
tt=tmp;
int x=tt.posx[i];
int y=tt.posy[i];
for(int j=1;j<=4;j++)
for(int k=1;k<=8;k++)
{
if(tt.m[j][k]==0) continue;
if(tt.m[j][k]!=tt.m[x][y-1]+1) continue;
swap(tt.m[x][y],tt.m[j][k]);
if( insert(tt) )
{
tt.dis=tmp.dis+1;
tt.posx[i]=j;
tt.posy[i]=k;
Q.push(tt);
if(flag)
{
return tt.dis;
}
}
}
}
}
return -1;
}
int main()
{
node tt;
for(int i=1;i<33;i++)
{
base[i]=base[i-1]*2;
}
endvalue=98430874871;
int t;
scanf("%d",&t);
while(t--)
{
while(!Q.empty()) Q.pop();
flag=0;
memset(Hash,-1,sizeof(Hash));
int k=1;
tt.m[1][1]=tt.m[2][1]=tt.m[3][1]=tt.m[4][1]=0;
for(int i=1;i<=4;i++)
{
for(int j=2;j<=8;j++)
{
scanf("%I64d",&tt.m[i][j]);
if(tt.m[i][j]==11) {tt.posx[k]=i;tt.posy[k++]=j;swap(tt.m[i][j],tt.m[1][1]);}
else if(tt.m[i][j]==21) {tt.posx[k]=i;tt.posy[k++]=j;swap(tt.m[i][j],tt.m[2][1]);}
else if(tt.m[i][j]==31) {tt.posx[k]=i;tt.posy[k++]=j;swap(tt.m[i][j],tt.m[3][1]);}
else if(tt.m[i][j]==41) {tt.posx[k]=i;tt.posy[k++]=j;swap(tt.m[i][j],tt.m[4][1]);}
}
}
tt.dis=0;
Q.push(tt);
insert(tt);
if(flag) printf("0\n");
else
printf("%d\n",bfs());
}
return 0;
}