题目传送门

题意:给出一个$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. [20171120]bash使用here documents的一个小细节.txt

    [20171120]bash使用here documents的一个小细节.txt --//昨天看bash文档,,发现一些小细节,做一个记录,就是EOF加引号的问题. command <<' ...

  2. C++中cin.clear()的用法

    我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream>  usin ...

  3. sublime text3最常用快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  4. 【PAT】B1055 集体照(25 分)

    很简单的two points问题 ##注意:K是行数 #include<stdio.h> #include<string.h> #include<map> #inc ...

  5. ES5数组的遍历方式

    /* 遍历数组 */ var arr=[1,2,3,43,55,66,77,99]; /* 遍历数组 function(item,index) */ arr.forEach(function(item ...

  6. linux命令之 df file fsck fuser

    有非常多人说,网上非常多知识点都有了.为什么你还要在自己的博客中反复这些东西呢? 我想说的是.别人写的东西是别人理解的东西,同一时候也是别人学习过程的总结,对于自己来说.自己写自己的博客最基本的目的就 ...

  7. 在eclipse中,使用spring tool suite配置spring环境

    本人第一次接触spring,在经过一天的努力之后,终于成功配置了spring环境. 使用spring tool suite配置 1.打开eclipse,选择help->Eclipse marke ...

  8. [SDOI2010]捉迷藏

    嘟嘟嘟 k-d tree板儿题. 建完树后对每一个点求一遍最小和最大曼哈顿距离,是曼哈顿,不是欧几里得. #include<cstdio> #include<iostream> ...

  9. 【转】一个域名是用哪里的DNS来解析的,电脑怎么知道找哪一个DNS呢? 我注册域名的时候会在服务商那里配置DNS解析,一般需要24小时后才能访问,我想知道,解析后的这个数据是不是会同步到世界上所有的DNS服务器呢!如果不是,当我访问我的这个域名的时候,电脑怎么知道去找到我注册的这一家的DNS服务器呢,谁告诉他的呢?

    看看DNS一些基础知识,你就了解了.1.DNS就是域名服务器,他的任务就是确定域名的解析,比如A记录MX记录等等. 2.任何域名都至少有一个DNS,一般是2个.为什么要2个以上呢?因为DNS可以轮回处 ...

  10. Python3 环境搭建

    Window 平台安装 Python: 以下为在 Window 平台上安装 Python 的简单步骤. 打开 WEB 浏览器访问 https://www.python.org/downloads/wi ...