Description
给定一个4*4的01棋盘,1代表棋子,0代表空格,棋子1每次可以移动到相邻上下左右四个位置的空格。
然后再给定你目标棋盘,问你最少在多少步能把当前棋盘变成目标棋盘状态。
Input
第一行输入一个整数t,代表有t组测试数据。
接下来给出只有0和1的4*4的当前棋盘和4*4的目标棋盘,中间有一个空行。
Output
输出一个整数表示最小的步数,若不能到达输出-1.
Sample Input
100010011110011111011110100001101
Sample Output
8
查找出棋盘中没有重合的1的位置 从上到下 从左到右搜索 本题数据较小(4*4)可以直接暴力搜索
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char map1[4][4],map2[4][4];
int vis1[4][4],vis2[4][4];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
for(int i=0;i<4;i++)
{
scanf("%s",&map1[i]);
}
for(int i=0;i<4;i++)
{
scanf("%s",&map2[i]);
}
int sum1=0,sum2=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(map1[i][j]=='1'&&map2[i][j]=='0')
{
sum1++;
vis1[i][j]=1;
}
else
{
if(map1[i][j]=='0'&&map2[i][j]=='1')
{
sum2++;
vis2[i][j]=1;
}
}
}
}
if(sum1!=sum2)
{
printf("-1
");
continue;
}
if(sum1==0&&sum2==0)
{
printf("0
");
continue;
}
int sum=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(vis1[i][j]==1)
{
int ii,jj,minn=50;
for(int a=0;a<4;a++)
{
for(int b=0;b<4;b++)
{
if(vis2[a][b]==1)
{
if( ( abs(i-a)+abs(j-b) )<minn)
{
minn=abs(i-a)+abs(j-b);
ii=a,jj=b;
}
}
}
}
vis1[i][j]=0;
vis2[ii][jj]=0;
sum+=minn;
}
}
}
printf("%d
",sum);
}
return 0;
}