zzulioj1922:棋盘

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\n");
			continue;
		}
		if(sum1==0&&sum2==0)
		{
			printf("0\n");
			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\n",sum);
	}
	return 0;
}


posted @ 2019-12-12 09:00  千金一发  阅读(65)  评论(0编辑  收藏  举报