zzzyc

导航

[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\n");
    else printf("%d\n",BFS());
}
代码

 

posted on 2018-07-12 15:37  zzzyc  阅读(135)  评论(0编辑  收藏  举报