zoukankan      html  css  js  c++  java
  • BZOJ 1054 [HAOI2008]移动玩具

    1054: [HAOI2008]移动玩具

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1388  Solved: 764
    [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

    题解:bfs爆搜咯

    窝一开始vis忘维护了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    MLE了N发啊啊啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<stack>
     6 #include<queue>
     7 #include<cstring>
     8 #define PAU putchar(' ')
     9 #define ENT putchar('
    ')
    10 using namespace std;
    11 const int lim=1<<16;
    12 const int dx[]={0,0,-1,1};
    13 const int dy[]={-1,1,0,0};
    14 bool vis[lim];
    15 int id(int i,int j){return i*4+j;}
    16 struct data{int key,d;};
    17 int pack(bool A[4][4]){
    18     int res=0;
    19     for(int i=0;i<4;i++)
    20         for(int j=0;j<4;j++)
    21             if(A[i][j])res|=(1<<id(i,j));return res;
    22 }
    23 inline int read(){
    24     int x=0;bool sig=1;char ch=getchar();
    25     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    26     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    27     return sig?x:-x;
    28 }
    29 inline void write(int x){
    30     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    31     int len=0,buf[20];while(x)buf[len++]=x%10,x/=10;
    32     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    33 }
    34 bool start[4][4],endin[4][4];int S,T;
    35 char s[6];
    36 int bfs(){
    37     queue<data>Q;Q.push((data){S,0});vis[S]=true;
    38     while(!Q.empty()){
    39         data x=Q.front();Q.pop();
    40         if(x.key==T)return x.d;
    41         for(int i=0;i<4;i++){
    42             for(int j=0;j<4;j++){
    43                 if(x.key&(1<<id(i,j)))for(int d=0;d<4;d++){
    44                     int i2=i+dx[d],j2=j+dy[d];
    45                     if(i2>=0&&i2<4&&j2>=0&&j2<4&&(!(x.key&(1<<id(i2,j2))))){
    46                         int v=x.key;v|=(1<<id(i2,j2));v-=(1<<id(i,j));
    47                         if(!vis[v])Q.push((data){v,x.d+1}),vis[v]=true;
    48                     }
    49                 }
    50             }
    51         }
    52     }return -1;
    53 }
    54 int main(){
    55     for(int i=0;i<4;i++){
    56         scanf("%s",s);
    57         for(int j=0;j<4;j++)if(s[j]-'0')start[i][j]=true;
    58     }
    59     for(int i=0;i<4;i++){
    60         scanf("%s",s);
    61         for(int j=0;j<4;j++)if(s[j]-'0')endin[i][j]=true;
    62     }
    63     S=pack(start);T=pack(endin);
    64     write(bfs());
    65     return 0;
    66 }
  • 相关阅读:
    Android实战技巧之六:PreferenceActivity使用详解
    Gradle for Android 第三篇( 依赖管理 )
    From 虚拟机模板 创建单节点K8S1.14.1的操作步骤
    Android实例剖析笔记(二)
    Android实例剖析笔记(一)
    Android 传感器
    Eclipse:引用一个项目作为类库(图文教程)
    Android Studio导入Project的方法
    Android Studio导入GitHub上的项目常见问题(有例子)
    AndroidStudio导入项目常见问题
  • 原文地址:https://www.cnblogs.com/chxer/p/4736176.html
Copyright © 2011-2022 走看看