Problem : [HAOI2008]移动玩具

Problem : [HAOI2008]移动玩具
原题链接:https://begin.lydsy.com/JudgeOnline/problem.php?cid=1258&pid=18

#include <cmath>
#include <cstdio>
#include <cstring>
char ch[10001];
char st[10001],ed[10001],dq[10001];
int dl[1000001],zb[1000001],h[1000001];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int js=0;
void read()
{
    scanf("%s",dq+1);
    st[1]=dq[1],st[2]=dq[2],st[3]=dq[3],st[4]=dq[4];
    scanf("%s",dq+1);
    st[5]=dq[1],st[6]=dq[2],st[7]=dq[3],st[8]=dq[4];
    scanf("%s",dq+1);
    st[9]=dq[1],st[10]=dq[2],st[11]=dq[3],st[12]=dq[4];
    scanf("%s",dq+1);
    st[13]=dq[1],st[14]=dq[2],st[15]=dq[3],st[16]=dq[4];

    scanf("%s",dq+1);
    ed[1]=dq[1],ed[2]=dq[2],ed[3]=dq[3],ed[4]=dq[4];
    scanf("%s",dq+1);
    ed[5]=dq[1],ed[6]=dq[2],ed[7]=dq[3],ed[8]=dq[4];
    scanf("%s",dq+1);
    ed[9]=dq[1],ed[10]=dq[2],ed[11]=dq[3],ed[12]=dq[4];
    scanf("%s",dq+1);
    ed[13]=dq[1],ed[14]=dq[2],ed[15]=dq[3],ed[16]=dq[4];
}
int Hash(char nu[10001])
{
    int da=0;
    for(int i=0;i<=15;i++)
    {
        if(nu[i]=='1')
        {
            da+=pow(2,16-i-1);
        }
    }
    return da;
}
void zh(int t)
{
    char yc[10001];
    for(int i=1;i<=16;i++)
    {
        if(((1<<i-1)&t)>0)
        {
            yc[i]='1';
        }
        else
        {
            yc[i]='0';
        }
    }
    for(int i=1;i<=16;i++)
    {
        ch[i]=yc[16-i+1];
    }
}
void bfs()
{
    int tou=1,wei=2;
    h[dl[1]]=1,zb[1]=0;
    while(tou<wei)
    {
        zh(dl[tou]);
        for(int i=1;i<=16;i++)
        {
            if(ch[i]=='0')
            {
                int x=0,y=0;
                if(i%4==0)
                {
                    x=i/4;
                }
                else
                {
                    x=i/4+1;
                }
                y=i%4;
                if(y==0)
                {
                    y=4;
                }
                int k=(x-1)*4+y;
                for(int j=0;j<=3;j++)
                {
                    int nx=x+dx[j];
                    int ny=y+dy[j];
                    if(nx>=1 && nx<=4 && ny>=1 && ny<=4 && ch[(nx-1)*4+ny]=='1')
                    {
                        int nk=(nx-1)*4+ny;
                        char now[101];
                        for(int t=1;t<=16;t++)
                        {
                            now[t]=ch[t];
                        }
                        now[k]='1';
                        now[nk]='0';
                        int xn=Hash(now+1);
                        if(xn==js)
                        {
                            printf("%d",zb[tou]+1);
                            return ;
                        }
                        if(h[xn]==0)
                        {
                            dl[wei]=xn;
                            h[xn]=wei;
                            zb[wei]=zb[tou]+1;
                            wei++;
                        }
                    }
                }
            }
        }
        tou++;
    }
}
int main()
{
    read();
    dl[1]=Hash(st+1);
    js=Hash(ed+1);
    if(dl[1]==js)
    {
        printf("0");
        return 0;
    }
    bfs();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录第一篇 电气工程基础篇第一章 电气工程基础理论第二章 电工材料与电线电缆第三章 仪器仪有及其检测第四章 电子器件与电子电路第二篇 电气工程安装与维护篇第五章 电机及其安装维护技术第六章 变压器及其安装与维护技术第七章 互感器安装与维修技术第八章 低压电器安装与维护第九章 高压电器安装与维修技术第十章 机床电气设备安装与维护技术第十一章 架空线路的安装运行与维护第十二章 电缆线路安装运行与维护第十三章 室内布线运行与维护技术第十四章 母线安装与维护第十五章 控制电缆安装与维护第十六章 电气照明安装运行与维护第十七章 电气配电装置安装运行与维护第十八章 蓄电池安装与维护第十九章 起重和运输设备安装与维修技术第二十章 接地防雷装置安装与维护第二十一章 并联电容器安装与维护第二十二章 特殊场所电气安装与维护第二十三章 电气控制设备的安装与维护第二十四章 弱电系统安装与维护第三篇 电气运行技术篇第二十五章 发电厂与电力系统第二十六章 二次回路第二十七章 电力系统稳定运行技术第二十八章 配电网控制自动化技术第二十九章 发电厂远动与调度通信系统第四篇 电气工程安全技术篇第三十章 电气安全与直接触电击防护第三十一章 防雷保护与间接接触电击防护技术第三十二章 过电压与漏电保护第三十三章 电气线路与建筑防雷保护第三十四章 电气设备安全与触电保护第三十五章 电气防火防爆技术第五篇 电气控制与测试篇第三十六章 电气自动控制系统的分类与功能第三十七章 电气控制线路设计方法第三十八章 线性定常控制系统的数学模型第三十九章 非线性控制系统第四十章 电气控制故障分析与调试第四十一章 最优控制、自适应控制及其知能控制第四十二章 介电强度测试第四十三章 传感器测试技术第四十四章 自动测试系统第四十五章 在线测试第四十六章 信号的时域、频域及数据据域测试缺 第四十七章 抗乾扰测试技术

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值