用BFS搜索,关键是要对状态判重,可以用hash,也可以直接用map,这里用了用map更简单些
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
const int N=32;
const char end1[]={11,12,13,14,15,16,17,1,21,22,23,24,25,26,27,1,31,32,33,34,35,36,37,1,41,42,43,44,45,46,47,1};
string end0;
int a[4][8];
string change()
{
string s="";
for(int i=0;i<4;i++)
for(int j=0;j<=7;j++)
s+=a[i][j];
return s;
}
void prt(string s)
{
int p[32];
for(int i=0;i<32;i++)
p[i]=s[i];
for(int i=0;i<32;i++)
printf("%d ",p[i]);
printf("\n");
}
int main()
{
end0="";
for(int i=0;i<32;i++)
end0+=end1[i];
int T;
scanf("%d",&T);
while(T--)
{
for(int i=0;i<4;i++)
for(int j=1;j<=7;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<4;i++)
for(int j=1;j<=7;j++)
if(a[i][j]==11||a[i][j]==21||a[i][j]==31||a[i][j]==41)
a[i][j]=1;
a[0][0]=11;
a[1][0]=21;
a[2][0]=31;
a[3][0]=41;
map<string,int> m;
string s=change();
queue<string> q;
q.push(s);
m[s]=1;
//prt(end0);
while(!q.empty())
{
string u=q.front();//prt(u);
q.pop();
if(u==end0) break;
for(int i=0;i<32;i++)
if(u[i]==1)
{
string v=u;
for(int j=0;j<32;j++)
if(u[j]==u[i-1]+1)
{
v[i]=u[j];
v[j]=1;
break;
}
if(!m[v])
{
q.push(v);
m[v]=m[u]+1;
}
}
}
if(m[end0]!=0) printf("%d\n",m[end0]-1);
else printf("-1\n");
}
return 0;
}