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

    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

    搜索,求最优的就用BFS,记得判重复状态就好

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 using namespace std;
     6 char a[6][6],b[6][6];
     7 struct node{
     8     char a[6][6];
     9 }A,B,T,q[1000001];
    10 int Ans[1000001],dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};
    11 bool f[1000001];
    12 int judge(node A)
    13 {
    14     int ans=0,base=1;;
    15     for (int i=1;i<=4;++i)
    16         for (int j=1;j<=4;++j)
    17             ans+=base*(A.a[i][j]-48),base*=2;
    18     return ans;
    19             
    20 }
    21 int main()
    22 {
    23     char ch[10];
    24     memset(A.a,-1,sizeof(a));
    25     memset(B.a,-1,sizeof(b));
    26     for (int i=1;i<=4;++i)
    27     {
    28         scanf("%s",ch);
    29         for (int j=1;j<=4;++j)
    30             A.a[i][j]=ch[j-1];
    31     }
    32     for (int i=1;i<=4;++i)
    33     {
    34         scanf("%s",ch);
    35         for (int j=1;j<=4;++j)
    36             B.a[i][j]=ch[j-1];
    37     }
    38     int head=0;
    39     int tail=1;
    40     q[1]=A;
    41     f[judge(A)]=true;
    42     if (judge(A)==judge(B))
    43     {
    44         printf("0");
    45         return 0;
    46     }
    47     do
    48     {
    49         ++head;
    50         node T=q[head];
    51         for (int i=1;i<=4;++i)
    52             for (int j=1;j<=4;++j)
    53                 if (T.a[i][j]=='1')
    54                     for (int k=1;k<=4;++k)
    55                         if (T.a[i+dx[k]][j+dy[k]]=='0')
    56                         {
    57                             swap(T.a[i][j],T.a[i+dx[k]][j+dy[k]]);
    58                             int x=judge(T);
    59                             if (!f[x])
    60                             {                                    
    61                                 ++tail;
    62                                 q[tail]=T;
    63                                 f[x]=true;
    64                                 Ans[tail]=Ans[head]+1;
    65                                 if (x==judge(B))
    66                                 {
    67                                     printf("%d",Ans[tail]);
    68                                     return 0;
    69                                 }                            
    70                             }
    71                             swap(T.a[i][j],T.a[i+dx[k]][j+dy[k]]);
    72                         }
    73     }while (head<tail);
    74 }
  • 相关阅读:
    分享 | 自定义属于自己的U盘图标
    GIF工具 | 分享几个Gif相关工具
    XTU | 人工智能入门复习总结
    XTU | 物联网概论复习总结
    收纳箱2号 | 前端开发大全
    收纳箱1号 | GitHub Pages部署静态网页的一点私货
    博客 | 基于Travis CI实现Hexo在Github和Coding的同步自动化部署
    图床plus演示 | 图床及在线分享演示文稿工具
    css写实心正三角和倒三角
    React 多个className的写法
  • 原文地址:https://www.cnblogs.com/refun/p/8678522.html
Copyright © 2011-2022 走看看