题目传送门

题意:给出一个$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. Spring装配bean(在java中进行显式配置)

    1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行 ...

  2. [VUE ERROR] Invalid prop: type check failed for prop "list". Expected Array, got Undefined

    错误原因: 子组件 props -> list 要求接收的数据类型是 Array, 然而实际接收到的是 Undefined. 子组件代码: props: { list: { type: Arra ...

  3. 最新安全狗 apache v4.0 sql注入 bypass

    前言 最近没事学习一下 waf 的 bypass , 本文介绍下 bypass 安全狗的笔记.个人感觉 bypass 的总思路(正则匹配型 waf)就是利用各种语法特性来逃避正则(当然要保证语法正确性 ...

  4. (网页)在SQL Server中为什么不建议使用Not In子查询(转)

    转自博客园宋沄剑  英文名:CareySon : 在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: ...

  5. vue权威指南笔记01——样式的设置

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Python基础点

    写这篇的目的并不是要把python的基础知识汇总一遍,而是着重记录一些实际编写代码时遇到的常用/重要的内容 以点的形式记录,之后遇到的内容会慢慢补充进来 1. 斜杠 / :斜字第一笔, 转义用反斜杠 ...

  7. [Winform-WebBrowser]-在html页面中js调用winForm类方法

    在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部: 1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类可以com组件的 ...

  8. webApi core2 DI通过代码来获取容器里面已注入的对象

    请求服务 来自 HttpContext 的一次 ASP.NET 请求中可用的服务通过 RequestServices 集合公开的. 请求服务将你配置的服务和请求描述为应用程序的一部分.当你的对象指定依 ...

  9. PL/SQL 删除主键 ORA-02443: 无法删除约束条件-不存在的约束条件

    在PL/SQL developer中删除一个表的主键,然后把另外一个字段设置成主键,删除的过程中报错:ORA-02443 我遇到这个问题出现的背景是: alter table saleqtya dro ...

  10. 求助pycharm里import pandas遇到No module named pandas怎么办

    目测是安转pandas库之后pycharm对库的检索没有更新.(能理解意思就行,我也是小白,不会专业术语,刚巧我也遇到了这样的问题所以来回答)我当时解决这个问题也算是瞎猫遇见死耗子. &amp ...