判断11步能否到达目标状态,类似八数码
用dfs和hash判重做的,居然过了,还是数据量小的原因吧
#include <stdio.h>
#include <string.h>
int f,ans;
char s[30],d[30]={"111110111100 110000100000"};
int k[30],min;
int stex[8] = {-2,2,2,-2,1,1,-1,-1};
int stey[8] = {-1,-1,1,1,2,-2,2,-2};
int hash(char *s)
{
int sum=0;
for(int i=0;i<25;i++)
if(s[i]=='1')sum+=k[i];
return sum;
}
int dfs(int x,int y,int cur,char *s)
{
if(s[12]==' '&&hash(s)==ans)
{
if(cur<min)min=cur;
return 0;
}
if(cur==10)return 0;
for(int i=0;i<8;i++)
{
if(x+stex[i]>=0&&x+stex[i]<5&&y+stey[i]>=0&&y+stey[i]<5)
{
char t=s[x*5+y];
s[x*5+y]=s[(x+stex[i])*5+y+stey[i]];
s[(x+stex[i])*5+y+stey[i]]=t;
dfs(x+stex[i],y+stey[i],cur+1,s);
t=s[x*5+y];
s[x*5+y]=s[(x+stex[i])*5+y+stey[i]];
s[(x+stex[i])*5+y+stey[i]]=t;
}
}
}
int main()
{
k[0]=1;
for(int i=1;i<25;i++)
k[i]=k[i-1]*2;
ans=hash(d);
int T;
scanf("%d",&T);
while(T--)
{
int p=0,b;
for(int i=0;i<5;i++)
{getchar();
for(int j=0;j<5;j++)
{scanf("%c",&s[p++]);
if(s[p-1]==' '){b=p-1;}}
}
min=11;
dfs(b/5,b%5,0,s);
if(min<11)printf("Solvable in %d move(s).\n",min);
else printf("Unsolvable in less than 11 move(s).\n");
}
return 0;
}