WA.Need some test cases.
Code: Select all
#include <bits/stdc++.h>
using namespace std;
int manh[45][45],grid[45],n,bound;
int man()
{
int r1,c1,r2,c2,i,j;
for(i=1;i<=41;i++)
{
r1=(i-1)/4;
r1++;
c1=i%4;
if(c1==0)
c1=4;
for(j=1;j<=41;j++)
{
r2=(j-1)/4;
r2++;
c2=j%4;
if(c2==0)
c2=4;
manh[i][j]=abs(r1-r2)+abs(c1-c2);
}
}
return 0;
}
int h()
{
int i,j,k=0;
for(i=1;i<=n;i++)
{
if(grid[i]!=1)
k=k+manh[i][grid[i]];
}
return k;
}
bool done;
int solve(int g_val,int h_val,int king_pos,int mv)
{
int f_val=g_val+h_val;
if(h_val==0)
{
done=true;
return f_val;
}
if(f_val>bound)
{
return f_val;
}
int mx=100000000,k,v;
//(i+1), (i+3), (i+4), (i-4)
if(king_pos%4==1)
{
if(mv!=-1&&king_pos+1<=n)
{
k=h_val-manh[grid[king_pos+1]][king_pos+1];
swap(grid[king_pos],grid[king_pos+1]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+1,1);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+1]);
}
if(mv!=-3&&king_pos+3<=n)
{
k=h_val-manh[grid[king_pos+3]][king_pos+3];
swap(grid[king_pos],grid[king_pos+3]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+3,3);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+3]);
}
if(mv!=-4&&king_pos+4<=n)
{
k=h_val-manh[grid[king_pos+4]][king_pos+4];
swap(grid[king_pos],grid[king_pos+4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+4,4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+4]);
}
if(mv!=4&&king_pos-4>0)
{
k=h_val-manh[grid[king_pos-4]][king_pos-4];
swap(grid[king_pos],grid[king_pos-4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-4,-4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-4]);
}
}
//(i+1), (i-1), (i+4), (i-4)
if(king_pos%4==2||king_pos%4==3)
{
if(mv!=-1&&king_pos+1<=n)
{
k=h_val-manh[grid[king_pos+1]][king_pos+1];
swap(grid[king_pos],grid[king_pos+1]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+1,1);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+1]);
}
if(mv!=1&&king_pos-1>0)
{
k=h_val-manh[grid[king_pos-1]][king_pos-1];
swap(grid[king_pos],grid[king_pos-1]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-1,-1);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-1]);
}
if(mv!=-4&&king_pos+4<=n)
{
k=h_val-manh[grid[king_pos+4]][king_pos+4];
swap(grid[king_pos],grid[king_pos+4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+4,4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+4]);
}
if(mv!=4&&king_pos-4>0)
{
k=h_val-manh[grid[king_pos-4]][king_pos-4];
swap(grid[king_pos],grid[king_pos-4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-4,-4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-4]);
}
}
//(i-3), (i-1), (i+4), (i-4)
if(king_pos%4==0)
{
if(mv!=3&&king_pos-3>0)
{
k=h_val-manh[grid[king_pos-3]][king_pos-3];
swap(grid[king_pos],grid[king_pos-3]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-3,-3);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-3]);
}
if(mv!=1&&king_pos-1>0)
{
k=h_val-manh[grid[king_pos-1]][king_pos-1];
swap(grid[king_pos],grid[king_pos-1]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-1,-1);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-1]);
}
if(mv!=-4&&king_pos+4<=n)
{
k=h_val-manh[grid[king_pos+4]][king_pos+4];
swap(grid[king_pos],grid[king_pos+4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos+4,4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos+4]);
}
if(mv!=4&&king_pos-4>0)
{
k=h_val-manh[grid[king_pos-4]][king_pos-4];
swap(grid[king_pos],grid[king_pos-4]);
k=k+manh[grid[king_pos]][king_pos];
v=solve(g_val+1,k,king_pos-4,-4);
mx=min(mx,v);
swap(grid[king_pos],grid[king_pos-4]);
}
}
return mx;
}
int ida(int king_pos)
{
bound=h();
done=false;
int m=bound;
while(!done)
{
bound=solve(0,m,king_pos,10);
}
return bound;
}
int main()
{
int cs=0,i,j;
man();
while(cin>>n&&n)
{
for(i=1;i<=n;i++)
{
cin>>grid[i];
if(grid[i]==1)
j=i;
}
cs++;
cout<<"Set "<<cs<<":\n";
cout<<ida(j)<<endl;
}
return 0;
}