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 }
  • 相关阅读:
    【程序员面试宝典】第五章 程序设计基本概念
    win7打开或关闭windows功能 提示“出现错误,并非所有的功能被更改”,管理员权限惹的祸
    堆排序
    目态与管态的概念
    循环不变式的概念
    getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析
    java算法 -- 冒泡排序
    Java算法 -- 二分查找
    Sql知识点总结
    java实现 链表反转
  • 原文地址:https://www.cnblogs.com/refun/p/8678522.html
Copyright © 2011-2022 走看看