• [HAOI2008]移动玩具


    这又是一道神奇的搜索题。。。只要记录每种状态。。。然后暴力判断这种状态往后一步的情况。。。

    广搜出最优解即可。。。

    呆码:

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    
    int dx[5]={0,0,1,0,-1};
    int dy[5]={0,1,0,-1,0};
    int dis[100010];
    char st[5];
    bool use[100010];
    
    struct asd{
        int a[5][5],num;
        int sum() {
            int tot=0;
            for(int i=1;i<=4;i++)
                for(int j=1;j<=4;j++)
                    tot+=(a[i][j]<<4*(i-1)+j-1);
            return tot;
        }
        void read() {
            for(int i=1;i<=4;i++)
            {
                scanf("%s",st);
                for(int j=1;j<=4;j++)
                    a[i][j]=(st[j-1]=='1' ? 1 : 0);
            }
            num=sum();
        }
    }s,t;
    
    inline int BFS()
    {
        memset(dis,50,sizeof(dis));
        queue <asd> q;
        q.push(s); dis[s.num]=0; use[s.num]=1;
        while(!q.empty())
        {
            asd now=q.front(); q.pop();
            for(int x=1;x<=4;x++)
            for(int y=1;y<=4;y++)
                if(now.a[x][y])
                    for(int i=1;i<=4;i++)
                    {
                        int xx=x+dx[i];
                        int yy=y+dy[i];
                        if(xx>=1 && xx<=4 && yy>=1 && yy<=4 && !now.a[xx][yy])
                        {
                            swap(now.a[xx][yy],now.a[x][y]);
                            asd u=now; u.num=u.sum();
                            swap(now.a[xx][yy],now.a[x][y]);
                            if(!use[u.num])
                            {
                                dis[u.num]=dis[now.num]+1;
                                if(u.num==t.num) return dis[t.num];
                                q.push(u); use[u.num]=1;
                            }
                        }
                    }
        }
        return dis[t.num];
    }
    
    int main()
    {
        s.read(); t.read();
        if(s.num==t.num) printf("0
    ");
        else printf("%d
    ",BFS());
    }
    代码
  • 相关阅读:
    Java学习-sgg-day09-20200425
    Java学习-sgg-day08-20200423
    C#集合
    C#类型转换
    HTML+CSS注意知识点
    easyUI学习(1)
    sort方法根据数组中对象的某一个属性值进行排序
    Vue Router 知识点梳理(二)
    Vue Router 知识点梳理
    浏览器加载、解析、渲染的过程
  • 原文地址:https://www.cnblogs.com/zzzyc/p/9299741.html
Copyright © 2020-2023  润新知