【zzulioj 1922】

本文探讨了一个4*4的01棋盘问题,即如何将初始棋盘状态通过移动棋子达到目标状态所需的最少步数。介绍了通过计算不同位置之间的曼哈顿距离来确定最优解的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<cstdio>
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)<sum){
                          sum=abs(ml-i)+abs(nl-j);
                          kml=ml; knl=nl;
                        }
                    }
                ans+=sum;
                mb[kml][knl]=0;
                }
            }
            printf("%d\n",ans);
        }
        else
            printf("-1\n");
    }
    return 0;
}

/**************************************************************
    Problem: 1922
    User: WYK1997
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:872 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值