Description
在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人心中的目标状态。
Input
前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。
Output
一个整数,所需要的最少移动次数。
Sample Input
1111
0000
1110
0010
1010
0101
1010
0101
Sample Output
4
题解
一个队友打了38行的代码
我打了350+。。
我觉得我可以考虑一下敲死自己
就,状压成一维,然后我搞了好多情况讨论。。其实根本不用讨论的。。(直接高端check)
直接判第一行第一列第四行第四列还有1 4 13 16 ,这些不能往四周移动
其他就想一想乱搞一下
代码可读性超差
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int bin[25];
bool v[(1<<17)];
struct node
{
int x,dep;
};
int sum[5][5];
void get(int x)
{
memset(sum,0,sizeof(sum));
int t=16;
while(x)
{
if(x%2==1)sum[(t-1)/4+1][(t-1)%4+1]=1;
else sum[(t-1)/4+1][((t-1)%4+1)]=0;
x/=2;
t--;
}
/*for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)printf("%d",sum[i][j]);
printf("\n");
}
printf("\n");*/
}
node list[(1<<17)];int head,tail;
char sx[10][10],sy[10][10];
int st,ed;
int main()
{
bin[16]=1;for(int i=15;i>=1;i--)bin[i]=bin[i+1]*2;
for(int i=1;i<=4;i++)scanf("%s",sx[i]+1);
getchar();
for(int i=1;i<=4;i++)scanf("%s",sy[i]+1);
st=ed=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
if(sx[i][j]=='1')st=st*2+1;
else st=st*2;
}
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
if(sy[i][j]=='1')ed=ed*2+1;
else ed=ed*2;
}
if(st==ed){printf("0\n");return 0;}
memset(v,false,sizeof(v));v[st]=true;
node aa;aa.x=st;aa.dep=0;
head=1;tail=2;
list[1]=aa;
while(head!=tail)
{
node tmp=list[head];
int x=tmp.x;
for(int i=1;i<=16;i++)
if((x&bin[i])!=0)
{
if(i%4!=1 && i%4!=0 && i>4 && i<12)
{
int u=i-4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
else if(i%4==1 && i!=13 && i!=1)
{
int u=i+1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
if(i>4)
{
int u=i-4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
if(i<=12)
{
int u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
}
else if(i%4==0 && i!=4 && i!=16)
{
int u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
if(i>4)
{
int u=i-4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
if(i<=12)
{
int u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
}
else if(i>1 && i<4)
{
int u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
else if(i>13 && i<16)
{
int u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i-4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;
if(tail==(1<<16)+1)tail=1;
}
}
else if(i==1)
{
int u=i+1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
else if(i==16)
{
int u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i-4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+50)tail=1;
}
}
else if(i==4)
{
int u=i-1;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i+4;
if(((x&bin[u]))==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
else if(i==13)
{
int u=i+1;
if((x&bin[u])==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
u=i-4;
if((x&bin[u])==0 && v[((x^bin[i])|(bin[u]))]==false)
{
node cnt=tmp;
cnt.x=((x^bin[i])|(bin[u]));
cnt.dep++;
get(cnt.x);
if(cnt.x==ed){printf("%d\n",cnt.dep);return 0;}
list[tail++]=cnt;v[cnt.x]=true;if(tail==(1<<16)+1)tail=1;
}
}
}
head++;
if(head==(1<<16)+50)head=1;
}
return 0;
}