【zzulioj 1922】
发布日期:2021-11-04 12:58:42 浏览次数:6 分类:技术文章

本文共 1456 字,大约阅读时间需要 4 分钟。

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~~奈何 ~~

只能由原来的棋盘去移成最后的结果棋盘,不能按结果棋盘,去由原棋盘去移成~~

#include
char pa[5][5],ma[5][5];int pb[5][5],mb[5][5];int abs(int a){ if(a<0) return -a;}int main(){ int T,i,j,ans,sum,sum1,sum2,ml,nl,kml,knl; scanf("%d",&T); while(T--) {
for(i=0;i<4;i++) for(j=0;j<4;j++) pb[i][j]=mb[i][j]=0; for(i=0;i<4;i++) scanf("%s",pa[i]); for(i=0;i<4;i++) scanf("%s",ma[i]); sum1=sum2=0; for(i=0;i<4;i++) for(j=0;j<4;j++) {
if(pa[i][j]=='1'&&ma[i][j]=='0'){
pb[i][j]=1; sum1++; } if(pa[i][j]=='0'&&ma[i][j]=='1'){
mb[i][j]=1; sum2++; } } if(sum1==sum2) {
ans=0; for(i=0;i<4;i++) for(j=0;j<4;j++) {
if(pb[i][j]==1) {
sum=0x3f3f3f3f; for(ml=0;ml<4;ml++) for(nl=0;nl<4;nl++) {
if(mb[ml][nl]==1) if(abs(ml-i)+abs(nl-j)

转载地址:https://blog.csdn.net/WYK1823376647/article/details/52243101 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【vector 的用发说明】
下一篇:【zzulioj 1916 DFS序 + 树状数组】

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月03日 17时42分07秒