题目传送门

题意:给出一个$N \times M$的棋盘,棋盘上有一些块可以移动,有一些块无法移动。$Q$次询问,每一次询问给出三个块$a,b,c$,将$a$块变为空格,空格旁边可移动的块可以与空格交换位置。问每一次询问中最小的将$b$块移动到$c$块最开始位置上的移动次数。$N , M \leq 30 , Q \leq 500$


我觉得我在$NOIP$考场上绝对会直接打暴力qwq

我们能够发现空格必须要在需要移动的格子的四周,而且不移动需要移动的格子,才能发挥效果。所以当空格在需要移动的格子旁边的时候,只有两种情况:①将需要移动的格子与空格交换位置;②将空格移动到需要移动的格子的另一侧。所以我们预处理:$f_{i,j,k,l}$表示将空格从格子$i,j$的方向$k$移动到方向$l$且不移动$(i,j)$的最少步数,可以通过$bfs$实现,复杂度$O(16N^2M^2)$

接下来就是一个类似于最短路的问题了。然而最开始空格与需要移动的格子不相邻,所以我们在每一次询问的时候,再一次$bfs$计算现在空格的位置到达需要移动的格子四周且不移动需要移动的格子的最少移动次数,然后跑$SPFA$即可。因为图很小,卡不了$SPFA$。

 #include<bits/stdc++.h>
 using namespace std;

 inline int read(){
     ;
     char c = getchar();
     while(!isdigit(c))
         c = getchar();
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return a;
 }

 ][] = {,,,,-,,,-};
 ][][][] , dis[][][] , t[][] , N , M , Q;
 ][] , inq[][][];
 struct be{
     int x , y , dir;
 }now;

 queue < pair < int , int > > q;
 queue < be > q1;

 inline int SPFA(int aX , int aY , int bX , int bY , int cX , int cY){
     while(!q.empty())
         q.pop();
     if(!canbe[aX][aY] || !canbe[bX][bY])
         return 0x3f3f3f3f;
     memset(t , 0x3f , sizeof(t));
     t[aX][aY] = ;
     q.push(make_pair(aX , aY));
     while(!q.empty()){
         pair < int , int > r = q.front();
         q.pop();
         if(r.first == bX && r.second == bY)
             return t[bX][bY];
          ; i <  ; i++)
             ] != cX || r.second + dir[i][] != cY)
                 ]][r.second + dir[i][]])
                     ]][r.second + dir[i][]] > t[r.first][r.second] + ){
                         t[r.first + dir[i][]][r.second + dir[i][]] = t[r.first][r.second] + ;
                         q.push(make_pair(r.first + dir[i][] , r.second + dir[i][]));
                     }
     }
     return 0x3f3f3f3f;
 }

 inline void bfs(int sX , int sY , int tX , int tY){
      ; i <  ; i++)
         if(dis[sX][sY][i] != 0x3f3f3f3f){
             inq[sX][sY][i] = ;
             q1.push((be){sX , sY , i});
         }
     while(!q1.empty()){
         now = q1.front();
         inq[now.x][now.y][now.dir] = ;
         q1.pop();
         if(now.x == tX && now.y == tY)
             continue;
          ; i <  ; i++)
             if(now.dir != i){
                 int N = dis[now.x][now.y][now.dir] + f[now.x][now.y][now.dir][i];
                 if(dis[now.x][now.y][i] > N){
                     dis[now.x][now.y][i] = N;
                     if(!inq[now.x][now.y][i]){
                         inq[now.x][now.y][i] = ;
                         q1.push((be){now.x , now.y , i});
                     }
                 }
             }
         ]][now.y + dir[now.dir][]][ - now.dir] > dis[now.x][now.y][now.dir] + ){
             dis[now.x + dir[now.dir][]][now.y + dir[now.dir][]][ - now.dir] = dis[now.x][now.y][now.dir] + ;
             ]][now.y + dir[now.dir][]][ - now.dir]){
                 inq[now.x + dir[now.dir][]][now.y + dir[now.dir][]][ - now.dir] = ;
                 q1.push((be){now.x + dir[now.dir][] , now.y + dir[now.dir][] ,  - now.dir});
             }
         }
     }
 }

 int main(){
     N = read();
     M = read();
     Q = read();
      ; i <= N ; i++)
          ; j <= M ; j++)
             canbe[i][j] = read();
     memset(f , 0x3f , sizeof(f));
      ; i <= N ; i++)
          ; j <= M ; j++)
             if(canbe[i][j])
                  ; m <=  ; m++)
                      ; n <=  ; n++)
                         f[i][j][m][n] = SPFA(i + dir[m][] , j + dir[m][] , i + dir[n][] , j + dir[n][] , i , j);
     while(Q--){
         int a = read() , b = read() , c = read() , d = read() , e = read() , f = read();
         if(c == e && d == f){
             printf("0\n");
             continue;
         }
         memset(dis , 0x3f , sizeof(dis));
          ; i <  ; i++)
             dis[c][d][i] = SPFA(a , b , c + dir[i][] , d + dir[i][] , c , d);
         bfs(c , d , e , f);
         int ans = 0x3f3f3f3f;
          ; i <  ; i++)
             ans = min(ans , dis[e][f][i]);
         printf( : ans);
     }
     ;
 }

Luogu1979 NOIP2013D2T3 华容道 搜索、最短路的更多相关文章

  1. NOIp2013D2T3 华容道【搜索&图论-最短路】

    题目传送门 暴力搜索 看到这道题的第一反应就是直接上$bfs$啦,也没有想到什么更加优秀的算法. 然后就是$15$分钟打了$70$分,有点震惊,纯暴力诶,这么多白给分嘛,太划算了,这可是$D2T3$诶 ...

  2. Remmarguts' Date POJ - 2449 (A*搜索|k短路)

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

  3. 2018/7/16 YMOI模拟 NOIP2013D2T3华容道

    题目描述 Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. ...

  4. [題解]TYVJ_2032(搜索/最短路)

    搜索:https://www.cnblogs.com/SiriusRen/p/6532506.html?tdsourcetag=s_pctim_aiomsg 來自 SiriusRen 數據範圍小,考慮 ...

  5. NOIP 2017 逛公园 记忆化搜索 最短路 好题

    题目描述: 策策同学特别喜欢逛公园.公园可以看成一张N个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. ...

  6. Luogu P1979 华容道(bfs+最短路)

    P1979 华容道 题意 题目描述 小B最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成, 最少需要多少时间. ...

  7. hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  8. HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  9. LOJ2613 NOIP2013 华容道 【最短路】*

    LOJ2613 NOIP2013 华容道 LINK 这是个好题,具体题意比较麻烦可以直接看LINK中的链接 然后考虑我们可能的移动方式 首先我们需要把白块移动到需要移动块S的附近(附近四格) 然后我们 ...

随机推荐

  1. 解决如下问题:You are using pip version 8.1.1, however version 18.0 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

    问题描述: 今天想学习一下TUM数据集RGBD-Benchmark工具的使用,利用python进行相关操作时,缺少一个第三方模块,于是打算用pip进行安装,便出现如下图所示的问题. 解决办法: 执行如 ...

  2. MySQL MySql连接数与线程池

    MySql连接数与线程池 by:授客 QQ:1033553122 连接数 1.  查看允许的最大并发连接数 SHOW VARIABLES LIKE 'max_connections'; 2.  修改最 ...

  3. Django之form总结

    复习Django项目结构: 主要的文件:manage.py,url.py,views.py,settings.py,models.py manage.py:项目管理文件,一般不做修改. url.py: ...

  4. xshell 5连接NAT模式的虚拟机

    这里简称真实的外部电脑为主机.当虚拟机NAT模式上网时(区别于桥接上网,桥接上网的话,主机和虚拟机可以互访),虚拟机是可以访问主机的,但是由于NAT机制,导致主机不能访问虚拟机,那么如何让主机上的xs ...

  5. js获取子节点和修改input的文本框内容

    js获取子节点和修改input的文本框内容 js获取子节点: $("#"+defaultPVItemId).children().eq(3); //获取某个选择器下的第四个子节点 ...

  6. C#项目实践之一——WPF多媒体通讯录

    1.Window.Resources  是一种Window级的资源定义. Window.Resources它的作用范围就是在Window容器里的所有子控件,也只有这些子控件才能引用/调用这些资源 Gr ...

  7. javascript闭包—围观大神如何解释闭包

    闭包的概念已经出来很长时间了,网上资源一大把,本着拿来主意的方法来看看. 这一篇文章 学习Javascript闭包(Closure) 是大神阮一峰的博文,作者循序渐进,讲的很透彻.下面一一剖析. 1. ...

  8. 17秋 软件工程 Alpha 事后诸葛亮会议

    题目: 团队作业--Alpha冲刺 17秋 软件工程 Alpha 事后诸葛亮会议 关于评价与建议的反馈 评价1:管理部门我觉得对我已经用处不大了不过对新生用处很大.像学长说的一样,里面不是流程很懂但是 ...

  9. [ ArcGIS for Server 10.1 系列 ] - 重新创建Site

    一般当ArcGIS Server Site发生错误.ArcGIS Server无法启动或者ArcGIS Server某服务没有实例,就可能需要重新的创建Site.有时可以通过重新创建Site,就发现其 ...

  10. DAG 模型 stacking boxes 动态规划

    题目:UVA 103 stacking boxes 题目大意: 给你两个数,一个是盒子的个数,一个是每一个盒子的维数.将一个个盒子互相装起来,让你求最多可以装多少个,要求字典序最小. 解析:这个就是盒 ...