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;
}