题目传送门

题意:给出一个$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. jQuery中bind() live() delegate() on() 的区别

    实例 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){aler ...

  2. XHTML结构化

    XHTML 规则概要 将传统的 HTML 转换为 XHTML 1.0 是快捷且无痛的,只要你遵守一些简单的规则和容易的方针.不管是否使用过 HTML,都不会妨碍你使用 XHTML. 使用恰当的文档类型 ...

  3. 网络基础 http 会话(session)详解

    http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...

  4. python2 与 python3 如何实现共存

    1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到 /root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解压后的文件夹内执 ...

  5. Python多继承

    # -*- coding: utf-8 -*- """ Created on Tue Nov 13 16:56:03 2018 @author: zhen "& ...

  6. [20180403]访问dba_autotask_task无输出问题.txt

    [20180403]访问dba_autotask_task无输出问题.txt --//链接http://www.itpub.net/thread-1911421-1-1.html的讨论,还没注意原先的 ...

  7. 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

    经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...

  8. Mysql基础之 binary关键字

    where子句的字符串比较是不区分大小写的,但是可以使用binary关键字设定where子句区分大小写

  9. mybatis的xml映射文件

    1,在进行统计查询时候,不想写映射的实体类,这时候设置返回的resultType类型是map <select id="getMap" resultType="jav ...

  10. MySql常用命令集Mysql常用命令4

    说明: 用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须 从中选择其中的一个. 1 FROM子句 FROM 子句指定了Select语句中字段的来源.FROM子句后面是包 ...