Description
给定一个4*4的01棋盘,1代表棋子,0代表空格,棋子1每次可以移动到相邻上下左右四个位置的空格。
然后再给定你目标棋盘,问你最少在多少步能把当前棋盘变成目标棋盘状态。
Input
第一行输入一个整数t,代表有t组测试数据。
接下来给出只有0和1的4*4的当前棋盘和4*4的目标棋盘,中间有一个空行。
Output
输出一个整数表示最小的步数,若不能到达输出-1.
Sample Input
1
0001
0011
1100
1111
1011
1101
0000
1101
Sample Output
8
一开始 想用DFS~~奈何 ~~
只能由原来的棋盘去移成最后的结果棋盘,不能按结果棋盘,去由原棋盘去移成~~
#include<cstdio>
char pa[5][5],ma[5][5];
int pb[5][5],mb[5][5];
int abs(int a)
{
if(a<0)
return -a;
}
int main()
{
int T,i,j,ans,sum,sum1,sum2,ml,nl,kml,knl;
scanf("%d",&T);
while(T--)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
pb[i][j]=mb[i][j]=0;
for(i=0;i<4;i++)
scanf("%s",pa[i]);
for(i=0;i<4;i++)
scanf("%s",ma[i]);
sum1=sum2=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(pa[i][j]=='1'&&ma[i][j]=='0'){
pb[i][j]=1;
sum1++;
}
if(pa[i][j]=='0'&&ma[i][j]=='1'){
mb[i][j]=1;
sum2++;
}
}
if(sum1==sum2)
{
ans=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(pb[i][j]==1)
{
sum=0x3f3f3f3f;
for(ml=0;ml<4;ml++)
for(nl=0;nl<4;nl++)
{
if(mb[ml][nl]==1)
if(abs(ml-i)+abs(nl-j)<sum){
sum=abs(ml-i)+abs(nl-j);
kml=ml; knl=nl;
}
}
ans+=sum;
mb[kml][knl]=0;
}
}
printf("%d\n",ans);
}
else
printf("-1\n");
}
return 0;
}
/**************************************************************
Problem: 1922
User: WYK1997
Language: C++
Result: Accepted
Time:0 ms
Memory:872 kb
****************************************************************/