zoukankan      html  css  js  c++  java
  • [BZOJ1054][HAOI2008]移动玩具 bfs+hash

    1054: [HAOI2008]移动玩具

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2432  Solved: 1355
    [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
     
    bfs+hash
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 char a[10][10];
     9 int t=0;
    10 int k=1;
    11 int now=0;
    12 int dis[150005];
    13 int q[150001];
    14 void bfs() {
    15     memset(dis,97,sizeof(dis));
    16     
    17     int head=0,tail=1;
    18     q[head]=now;
    19     dis[now]=0;
    20     while(head!=tail) {
    21         int n=q[head++];
    22         for(int i=1;i<=4;i++) {
    23             for(int j=1;j<=4;j++){
    24                 int to=1<<((i-1)*4+j-1);
    25                 if(!(n&to)) continue;
    26                 if(i>1) {
    27                     int tt=to>>4;
    28                     if(!(n&tt)) {
    29                         int next=n-to+tt;
    30                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
    31                         if(next==t){printf("%d",dis[next]);return;}
    32                     }
    33                 }
    34                 if(j>1) {
    35                     int tt=to>>1;
    36                     if(!(n&tt)) {
    37                         
    38                         int next=n-to+tt;
    39                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
    40                         if(next==t){printf("%d",dis[next]);return;}
    41                     }
    42                 }
    43                 if(j<4) {
    44                     int tt=to<<1;
    45                     if(!(n&tt)) {
    46                         int next=n-to+tt;
    47                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
    48                         if(next==t){printf("%d",dis[next]);return;}
    49                     }
    50                 }
    51                 if(i<4) {
    52                     int tt=to<<4;
    53                     if(!(n&tt)) {
    54                         int next=n-to+tt;
    55                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
    56                         if(next==t){printf("%d",dis[next]);return;}
    57                     }
    58                 }
    59              }
    60         }
    61     }
    62 }
    63 int main(){
    64     for(int i=1;i<=4;i++) {
    65         scanf("%s",a[i]);
    66         for(int j=1;j<=4;j++){
    67             now+=(a[i][j-1]-'0')*k;
    68             k<<=1;
    69         }
    70     }
    71     k=1;
    72     for(int i=1;i<=4;i++) {
    73         char x[10];
    74         scanf("%s",x);
    75         for(int j=1;j<=4;j++){
    76             t+=(x[j-1]-'0')*k;
    77             k<<=1;
    78         }    
    79     }
    80     bfs();
    81 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    DotnetCore 单文件发布
    Parallel.ForEach 之 MaxDegreeOfParallelism
    Quartznet速记
    C# SendAysnc 超时
    微耕门禁跨网段搜索代理
    服务守护DOS脚本
    Flutter速记
    ShowDoc速记
    Docker运行dotnetcore
    Redis速记
  • 原文地址:https://www.cnblogs.com/wls001/p/7686617.html
Copyright © 2011-2022 走看看