


4 12 13 14 15 16 17 21 22 23 24 25 26 27 31 32 33 34 35 36 37 41 42 43 44 45 46 47 11 26 31 13 44 21 24 42 17 45 23 25 41 36 11 46 34 14 12 37 32 47 16 43 27 35 22 33 15 17 12 16 13 15 14 11 27 22 26 23 25 24 21 37 32 36 33 35 34 31 47 42 46 43 45 44 41 27 14 22 35 32 46 33 13 17 36 24 44 21 15 43 16 45 47 23 11 26 25 37 41 34 42 12 31
0 33 60 -1
思路:BFS+hash判重。懒得写hash,直接用map了。
#include <stdio.h>
#include <map>
using namespace std;
struct{
int d[4][8],step;
}que[10000000],t;
map<long long,int>mp;
int main()
{
int T,i,j,p,q,m,n,num;
long long temp;
bool flag;
scanf("%d",&T);
while(T--)
{
mp.clear();
for(i=0;i<4;i++) que[0].d[i][0]=0;
for(i=0;i<4;i++) for(j=1;j<8;j++) scanf("%d",&que[0].d[i][j]);
for(i=0;i<4;i++)
{
for(j=1;j<8;j++)
{
if(que[0].d[i][j]==11)
{
que[0].d[i][j]=0;
que[0].d[0][0]=11;
}
if(que[0].d[i][j]==21)
{
que[0].d[i][j]=0;
que[0].d[1][0]=21;
}
if(que[0].d[i][j]==31)
{
que[0].d[i][j]=0;
que[0].d[2][0]=31;
}
if(que[0].d[i][j]==41)
{
que[0].d[i][j]=0;
que[0].d[3][0]=41;
}
}
}
int top=0,bottom=1;
que[top].step=0;
while(top<bottom)
{
t=que[top];
flag=1;
for(i=0;i<4 && flag;i++) for(j=0;j<7 && flag;j++) if(t.d[i][j]!=(i+1)*10+j+1) flag=0;
if(flag)
{
printf("%d\n",t.step);
break;
}
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
if(!t.d[i][j])
{
if(t.d[i][j-1] && t.d[i][j-1]%10<7) num=t.d[i][j-1]+1;
else continue;
flag=0;
for(p=0;p<4 && !flag;p++)
{
for(q=0;q<8 && !flag;q++)
{
if(t.d[p][q]==num)
{
t.d[p][q]=0;
t.d[i][j]=num;
flag=1;
t.step++;
temp=0;
for(m=0;m<4;m++) for(n=0;n<8;n++) temp+=t.d[m][n]*(1LL<<(m*10+n));//哈希
if(!mp[temp])
{
que[bottom++]=t;
mp[temp]=1;
}
t.step--;
t.d[p][q]=num;
t.d[i][j]=0;
}
}
}
}
}
}
top++;
}
if(top==bottom) printf("%d\n",-1);
}
}
HDU-1067-Gap(BFS+HASH),布布扣,bubuko.com
原文:http://blog.csdn.net/faithdmc/article/details/38510671