• [BZOJ1054] 移动玩具


    1054: [HAOI2008]移动玩具

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2741  Solved: 1537
    [Submit][Status][Discuss]

    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

    HINT

    Source


    提交地址BZOJ1054


    题解 :

    调了很久, 我还是太菜了;

    就是广搜,没什么难度;

    一个数组写错了调了半天QAQ;


    Code:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <queue> 
     4 #include <cstring>
     5 using namespace std;
     6 
     7 int dx[]={0, 1, 0, -1, 0}, dy[]={0, 0, 1, 0, -1};
     8 bool a[5][5], b[5][5];
     9 
    10 inline int Hash(bool t[5][5])
    11 {
    12     int k = 1, s = 0;
    13     for (register int i = 1 ; i <= 4 ; i ++)
    14     {
    15         for (register int j = 1 ; j <= 4 ;j ++)
    16         {
    17             s += k * t[i][j];k <<= 1;
    18         }
    19     }
    20     return s;
    21 }
    22 
    23 bool vis[100010];
    24 
    25 struct date
    26 {
    27     bool o[5][5];
    28     int stp;
    29 }q[100010];
    30 
    31 int main()
    32 {
    33     for (register int i = 1 ; i <= 4 ; i ++)
    34         for (register int j = 1 ; j <= 4 ; j ++)
    35             scanf("%1d", &a[i][j]), q[0].o[i][j] = a[i][j];
    36     for (register int i = 1 ; i <= 4 ; i ++)
    37         for (register int j = 1 ; j <= 4 ; j ++)
    38             scanf("%1d", &b[i][j]);
    39     
    40     int beg = Hash(a), end = Hash(b);
    41     if (beg == end) {puts("0");return 0;}
    42     vis[beg] = 1;    
    43     int l = 0, r = 1;
    44     while (l < r)
    45     {
    46         for (register int i = 1 ; i <= 4 ; i ++)
    47         {
    48             for (register int j = 1 ; j <= 4 ; j ++)
    49             {
    50                 if (!q[l].o[i][j]) continue;
    51                 for (register int k = 1 ; k <= 4 ; k ++)
    52                 {
    53                     int x = i + dx[k], y = j + dy[k];
    54                     if (q[l].o[x][y]) continue;
    55                     if (x <= 0 or y <= 0 or x > 4 or y > 4) continue;
    56                     swap(q[l].o[i][j], q[l].o[x][y]);
    57                     int H = Hash(q[l].o);
    58                     if (!vis[H])
    59                     {
    60                         if (H == end) {printf("%d
    ", q[l].stp +1);return 0;}
    61                         vis[H] = 1;
    62                         memcpy(q[r].o, q[l].o, sizeof q[r].o);
    63                         q[r].stp = q[l].stp + 1;
    64                         r++;
    65                     }
    66                     swap(q[l].o[i][j], q[l].o[x][y]);
    67                 }
    68             }
    69         }
    70         l++;
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )
    类的高级特性——抽象类
    多态
    继承、继承中的重写
    接口interface、实现接口implements
    “==”运算符与equals()
    静态成员
    对象
    属性和行为(成员变量和成员方法)
    字符串生成器
  • 原文地址:https://www.cnblogs.com/BriMon/p/9153285.html
Copyright © 2020-2023  润新知