您的位置:首页 > 其它

棋盘zzuli 1922

2016-08-18 17:46 232 查看


1922: A

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 70 Solved: 13

SubmitStatusWeb Board

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

我的wa代码
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool flag1[5][5],flag2[5][5];
char s1[5][5],s2[5][5];

int main(){
int t;
scanf("%d",&t);
while(t--){
memset(flag1,false,sizeof(flag1));
memset(flag2,false,sizeof(flag2));
for(int i=0; i<4; i++)	scanf("%s",s1[i]);
for(int i=0; i<4; i++)	scanf("%s",s2[i]);
int a = 0, b = 0;
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
if(s1[i][j] == '0'&&s2[i][j] == '1'){
flag1[i][j] = true; a++;
}
if(s1[i][j] == '1'&&s2[i][j] == '0'){
flag2[i][j] = true;	b++;
}
}
}
if (a!=b){
printf("-1\n");	continue;
}
if (a==0&&b==0){
printf("0\n");	continue;
}
int si,sj,s;
int ans = 0;
for(int i=0; i<4; i++){
for(int j=0; j<4; j++){
if(flag1[i][j]){
s = 20;
for(int ii=0; ii<4; ii++){
for(int jj=0; jj<4; jj++){
if(flag2[ii][jj]){
if(s > abs(ii-i)+abs(jj-j)){
s = abs(ii-i)+abs(jj-j);
si = ii; sj = jj;
}
}
}
}
ans+=s;	flag2[si][sj] = false;	flag1[i][j] = false;
}
}
}
printf("%d\n",ans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: