zoukankan      html  css  js  c++  java
  • 【bzoj1054】[HAOI2008]移动玩具

    #include<algorithm>
    #include<iostream> 
    #include<cstring>
    #include<cstdlib> 
    #include<cstdio>
    #include<cmath> 
    #include<queue>  
    using namespace std;
      
    int xx[5]={0,0,1,-1},
        yy[5]={1,-1,0,0};
     
    int bg,ed,h,x,y;
    int t,w=1;
     
    bool ans[5][5],mark[100010];
     
    char ch[5];
     
    struct data
    {
        bool a[5][5];
        int step;
    }q[100010];
     
    int hash(bool a[5][5])
    {
        int k=1,s=0;
        for (int i=1;i<=4;i++)
            for (int j=1;j<=4;j++)
            {
                s+=a[i][j]*k;
                k<<=1;
            }
        return s;
    }
     
    int main()
    {
        for (int i=1;i<=4;i++)
        {
            scanf("%s",ch);
            for (int j=1;j<=4;j++)
                q[0].a[i][j]=ch[j-1]-'0';
        }
        for (int i=1;i<=4;i++)
        {
            scanf("%s",ch);
            for (int j=1;j<=4;j++)
                ans[i][j]=ch[j-1]-'0';
        }
        bg=hash(q[t].a);
        ed=hash(ans);
        if (bg==ed)
        {
            printf("0");
            return 0;
        }
        mark[bg]=1;
        while (t<w)
        {
            for (int i=1;i<=4;i++)
                for (int j=1;j<=4;j++)
                    if (q[t].a[i][j])
                        for (int k=0;k<4;k++)
                        {
                            x=xx[k]+i;
                            y=yy[k]+j;
                            if (q[t].a[x][y] || x>4 || y>4 ||x<1 || y<1)
                                continue;
                            swap(q[t].a[i][j],q[t].a[x][y]);
                            h=hash(q[t].a);
                            if (!mark[h])
                            {
                                if (h==ed)
                                {
                                    printf("%d",q[t].step+1);
                                    return 0;
                                }
                                mark[h]=1;
                                memcpy(q[w].a,q[t].a,sizeof(q[w].a));
                                q[w].step=q[t].step+1;
                                w++;
                            }
                            swap(q[t].a[i][j],q[t].a[x][y]);
                        }
            t++;
        }
        return 0;
    }
    

      

  • 相关阅读:
    运算符和结合性
    几种排序算法 C++
    UNIX环境高级编程笔记
    几个C语言题与答案
    视频流中的DTS/PTS到底是什么 转载
    linux硬链接与软链接 转载
    HTTP POST上传文件(wininet实现)
    并查集(求最小生成树和集团问题)
    c++ vector
    C++STL priority_queue类
  • 原文地址:https://www.cnblogs.com/yangjiyuan/p/5547142.html
Copyright © 2011-2022 走看看