zoukankan      html  css  js  c++  java
  • BZOJ1054|HAOI2008移动玩具|广搜

    Description
    在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。
    Input
    前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。
    Output
    一个整数,所需要的最少移动次数。
    Sample Input
    1111
    0000
    1110
    0010

    1010
    0101
    1010
    0101
    Sample Output
    4

    分析:广搜+哈希优化

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    
    const int dx[5]={0,-1,0,1,0};
    const int dy[5]={0,0,1,0,-1};
    int ans[5][5];
    int use[66666];
    struct node{
           int a[5][5],step;
    }q[80001];
    
    int hash(int a[5][5])
    {
        int k=1,s=0;
        for (int i=1; i<=4; i++)
            for (int j=1; j<=4; j++)
            {
                s+=k*a[i][j];
                k=k<<1;
            }
        return s;
    }
    
    int main()
    {
        memset(use,0,sizeof(use));
        for (int i=1; i<=4; i++)
        {
            for (int j=1; j<=4; j++)
            {
                char c;
                c=getchar();
                q[1].a[i][j]=c-'0';
            }
            getchar();
        }
        getchar();
        for (int i=1; i<=4; i++)
        {
            for (int j=1; j<=4; j++)
            {
                char c;
                c=getchar();
                ans[i][j]=c-'0';
            }
            getchar();
        }
        int st=hash(q[1].a);
        int en=hash(ans);
        if (st==en) { printf("0"); return 0; }
        use[st]=1;
        int h=0,t=1;
        q[1].step=0;
        while (h<=t)
        {
              h++;
              for (int i=1; i<=4; i++)
                  for (int j=1; j<=4; j++)
                      if (q[h].a[i][j])
                         for (int k=1; k<=4; k++) 
                         {
                             int x=i+dx[k];
                             int y=j+dy[k];
                             if (x>4||y>4||x<1||y<1||q[t].a[x][y]) continue;
                             swap(q[h].a[i][j],q[h].a[x][y]);
                             int hh=hash(q[h].a);
                             if (!use[hh]) 
                             {
                                        if (hh==en) { printf("%d",q[h].step+1); system("pause"); return 0; }
                                        t++;
                                        memcpy(q[t].a,q[h].a,sizeof(q[t].a));
                                        q[t].step=q[h].step+1;
                                        use[hh]=1;
                            }
                            swap(q[h].a[i][j],q[h].a[x][y]);
                        }
        }
        return 0;
    }
  • 相关阅读:
    Sql 字符串按指定字符转多行(表值函数)
    C# 默认打印机设置
    Sql server 触发器状态查询
    指定周转对应日期
    Java发送HttpRequest
    Java实现手机号码归属地判别
    MySQL导入.sql文件及常用命令
    解释和编译的区别
    Java中的static关键字解析
    内存堆和栈的区别
  • 原文地址:https://www.cnblogs.com/Shymuel/p/4651857.html
Copyright © 2011-2022 走看看