zzuli 1922 (棋盘)

原题

 

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,其实for循环就可以搞定,当前棋盘可移动的棋子和目标棋盘棋子数一定相等,否则无法达到目标棋盘。

#include<cstdio>
#include<algorithm>
#define M 0x3f3f3f3f
using namespace std;
	int mapp[5][5],mmap[5][5];
	char map[5][5],map2[5][5];
int main(){
	int t, i, j, k, q,kk,qq;

	int ans1,ans2,ans,sum,mint;
	scanf ("%d",&t);
	while (t--){
		for (i=0;i<4;i++)
		for (j=0;j<4;j++)
			mapp[i][j]=mmap[i][j]=0;
		for (i=0;i<4;i++)
			scanf ("%s",map[i]);
		for (i=0;i<4;i++)
			scanf ("%s",map2[i]);
	ans1=ans2=0;
	for (i=0;i<4;i++){
		for (j=0;j<4;j++){
			if (map[i][j]=='1' &&map2[i][j]=='0'){ 
				mmap[i][j]=1;ans1++;
			}
			if (map[i][j]=='0' &&map2[i][j]=='1'){ 
				mapp[i][j]=1;
				ans2++;
			}
		}
	}
	if (ans1==ans2){
		ans=0;
		for (i=0;i<4;i++){
		for (j=0;j<4;j++){
			if (mmap[i][j]){
			mint=M;
			for (k=0;k<4;k++){
			for (q=0;q<4;q++){
			<span style="white-space:pre">	</span>if (mapp[k][q]){
				<span style="white-space:pre">	</span>if (mint>abs(k-i)+abs(q-j)){//找到当前最近的可移动位置
					mint = abs(k-i)+abs(q-j);
					kk=k;qq=q;
					}
									
				}
			}
					
		<span style="white-space:pre">	</span>}
			mapp[kk][qq]=0;
			ans+=mint;
		}
				
		}
		}
		printf ("%d\n",ans);
	}
	else
		printf ("-1\n");
		
	}
	
	
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值