棋盘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; }
相关文章推荐
- zzuli 1922 (棋盘)
- ZZULI 1922: A
- zzuli 1922 (暴力)
- zzuli 1922
- 波斯的棋盘
- 趣题:在指定形状的棋盘内放置n个相同的图形
- 棋盘覆盖问题原理及演示程序
- 扫雷定理 互补棋盘上的数字和相等
- 棋盘覆盖
- Camera Calibration摄像机棋盘标定(单副图)源程序
- 马踏棋盘C++代码
- ZZULI-暑假集训计划及相关规定[version 1.2]
- 棋盘问题--POJ 1321
- 棋盘覆盖
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- zzuli校赛牢骚
- 棋盘覆盖问题C++代码
- poj 2965 The Pilots Brothers' refrigerator--棋盘--深搜
- 棋盘类游戏中的栅格地形渲染
- 残缺棋盘(4.3.3_【例14】)