Luogu1979 NOIP2013D2T3 华容道 搜索、最短路

题目传送门

题意:给出一个$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$。

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 
  4 inline int read(){
  5     int a = 0;
  6     char c = getchar();
  7     while(!isdigit(c))
  8         c = getchar();
  9     while(isdigit(c)){
 10         a = (a << 3) + (a << 1) + (c ^ '0');
 11         c = getchar();
 12     }
 13     return a;
 14 }
 15 
 16 const int dir[4][2] = {0,1,1,0,-1,0,0,-1};
 17 int f[31][31][4][4] , dis[31][31][4] , t[31][31] , N , M , Q;
 18 bool canbe[32][32] , inq[31][31][4];
 19 struct be{
 20     int x , y , dir;
 21 }now;
 22 
 23 queue < pair < int , int > > q;
 24 queue < be > q1;
 25 
 26 inline int SPFA(int aX , int aY , int bX , int bY , int cX , int cY){
 27     while(!q.empty())
 28         q.pop();
 29     if(!canbe[aX][aY] || !canbe[bX][bY])
 30         return 0x3f3f3f3f;
 31     memset(t , 0x3f , sizeof(t));
 32     t[aX][aY] = 0;
 33     q.push(make_pair(aX , aY));
 34     while(!q.empty()){
 35         pair < int , int > r = q.front();
 36         q.pop();
 37         if(r.first == bX && r.second == bY)
 38             return t[bX][bY];
 39         for(int i = 0 ; i < 4 ; i++)
 40             if(r.first + dir[i][0] != cX || r.second + dir[i][1] != cY)
 41                 if(canbe[r.first + dir[i][0]][r.second + dir[i][1]])
 42                     if(t[r.first + dir[i][0]][r.second + dir[i][1]] > t[r.first][r.second] + 1){
 43                         t[r.first + dir[i][0]][r.second + dir[i][1]] = t[r.first][r.second] + 1;
 44                         q.push(make_pair(r.first + dir[i][0] , r.second + dir[i][1]));
 45                     }
 46     }
 47     return 0x3f3f3f3f;
 48 }
 49 
 50 inline void bfs(int sX , int sY , int tX , int tY){
 51     for(int i = 0 ; i < 4 ; i++)
 52         if(dis[sX][sY][i] != 0x3f3f3f3f){
 53             inq[sX][sY][i] = 1;
 54             q1.push((be){sX , sY , i});
 55         }
 56     while(!q1.empty()){
 57         now = q1.front();
 58         inq[now.x][now.y][now.dir] = 0;
 59         q1.pop();
 60         if(now.x == tX && now.y == tY)
 61             continue;
 62         for(int i = 0 ; i < 4 ; i++)
 63             if(now.dir != i){
 64                 int N = dis[now.x][now.y][now.dir] + f[now.x][now.y][now.dir][i];
 65                 if(dis[now.x][now.y][i] > N){
 66                     dis[now.x][now.y][i] = N;
 67                     if(!inq[now.x][now.y][i]){
 68                         inq[now.x][now.y][i] = 1;
 69                         q1.push((be){now.x , now.y , i});
 70                     }
 71                 }
 72             }
 73         if(dis[now.x + dir[now.dir][0]][now.y + dir[now.dir][1]][3 - now.dir] > dis[now.x][now.y][now.dir] + 1){
 74             dis[now.x + dir[now.dir][0]][now.y + dir[now.dir][1]][3 - now.dir] = dis[now.x][now.y][now.dir] + 1;
 75             if(!inq[now.x + dir[now.dir][0]][now.y + dir[now.dir][1]][3 - now.dir]){
 76                 inq[now.x + dir[now.dir][0]][now.y + dir[now.dir][1]][3 - now.dir] = 1;
 77                 q1.push((be){now.x + dir[now.dir][0] , now.y + dir[now.dir][1] , 3 - now.dir});
 78             }
 79         }
 80     }
 81 }
 82 
 83 int main(){
 84     N = read();
 85     M = read();
 86     Q = read();
 87     for(int i = 1 ; i <= N ; i++)
 88         for(int j = 1 ; j <= M ; j++)
 89             canbe[i][j] = read();
 90     memset(f , 0x3f , sizeof(f));
 91     for(int i = 1 ; i <= N ; i++)
 92         for(int j = 1 ; j <= M ; j++)
 93             if(canbe[i][j])
 94                 for(int m = 0 ; m <= 3 ; m++)
 95                     for(int n = 0 ; n <= 3 ; n++)
 96                         f[i][j][m][n] = SPFA(i + dir[m][0] , j + dir[m][1] , i + dir[n][0] , j + dir[n][1] , i , j);
 97     while(Q--){
 98         int a = read() , b = read() , c = read() , d = read() , e = read() , f = read();
 99         if(c == e && d == f){
100             printf("0\n");
101             continue;
102         }
103         memset(dis , 0x3f , sizeof(dis));
104         for(int i = 0 ; i < 4 ; i++)
105             dis[c][d][i] = SPFA(a , b , c + dir[i][0] , d + dir[i][1] , c , d);
106         bfs(c , d , e , f);
107         int ans = 0x3f3f3f3f;
108         for(int i = 0 ; i < 4 ; i++)
109             ans = min(ans , dis[e][f][i]);
110         printf("%d\n" , ans == 0x3f3f3f3f ? -1 : ans);
111     }
112     return 0;
113 }

 

转载于:https://www.cnblogs.com/Itst/p/9782108.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

user_tab_columns是什么

user_tab_columns是保存了当前用户的表、视图和Clusters中的列等信息&#xff0c;用于oracle获取表结构。 user_tab_cols不同的是比user_tab_columns多几列&#xff1a; HIDDEN_COLUMN VARCHAR2(3) VIRTUAL_COLUMN VARCHAR2(3) SEGMENT_COLUMN_ID NUMBER INTERNAL_COLUMN_…

英语初级学习系列-00-Name-介绍自己

1. 询问名字 常用句子 1. Hi, may I have your name, please? 2. Could you please tell me your name? 3. Will it be convenient for you if I have your name? 4. your name? 5. What is your name? 使用场景 你想知道别人的叫啥的时候你想和别人搭话&#xff08;搭讪&…

Oracle 怎么删除重复数据

1、根据rowid来查询重复数据 select * from table1 a where rowid !(select max(rowid) from table1 b where a.name1b.name1 ) 2、根据rowid来删除重复数据 delete from table1 a where rowid !(select max(rowid) from table1 b where a.name1b.name1 ) 3、根据group …

如何给代码自动添加注释?

丰富的注释和良好的代码规范&#xff0c;对于代码的阅读性和可维护性起着至关重要的作用。几乎每个公司对这的要求还是比较严格的&#xff0c;往往会形成自己的一套编码规范。但是再实施过程中&#xff0c;如果全靠手动完成&#xff0c;不仅效率低下&#xff0c;还难以保证真正…

一些jquery的使用方法

jquery给input赋值val(val) val(val)是jquery函数&#xff0c;最容易混淆的是获取input的函数是val()&#xff1b; 区别非常小&#xff0c;一个是带参数&#xff0c;一个是不带参数&#xff1b; <input name"user" class"txtshort" id"user&q…

判断select下拉框是否有选,并给下拉框赋值

使用select下拉框时&#xff0c;错误写法 var sex $(#sex).val(); alert(sex); //弹出的是&#xff1a;nullif(sex""){alert("请选择性别");return;} 应该写成&#xff1a; if(sexnull){alert("请选择性别");return;} 给下拉框赋值&#xff…

js第一天

1.JS介绍 全称叫JavaScript&#xff0c;但不是Java&#xff0c;js是一门前台语言&#xff0c;而Java是后台语言。 js的作者是布兰登.艾奇 前台语言&#xff1a;运行在客户端的 后台语言&#xff1a;跟数据库有关 2.JS可以干什么&#xff1f; 页面特效&#xff0c;开发页面游戏&…

Ubuntu 如何为 XMind 添加快速启动方式和图标

目录 Ubuntu 如何为 XMind 添加快速启动方式和图标Ubuntu 如何为 XMind 添加快速启动方式和图标 按照教程Ubuntu16.04LTS安装XMind8并创建运行图标进行Xmind安装 下载安装包打开~/Download文件夹&#xff0c;解压.zip压缩包&#xff0c;之后在解压的文件夹中打开终端&#xff0…

如何点击打印,直接打印出来,不弹打印设置选项

现在有两种解决方案,亲测有效。 (1).第一种是需要安装插件,网上下载ScriptX.cab文件 下载成功后将文件放在项目某个目录下,然后在页面body中写上: (记得codebase属性为ScriptX.cab文件的放置路径,是绝对路径) 把window.print()改成:factory.printing.Print(false)即可; 远…

[CQOI2014]通配符匹配

https://www.zybuluo.com/ysner/note/1311407 题面 几乎所有操作系统的命令行界面\((CLI)\)中都支持文件名的通配符匹配以方便用户。 最常见的通配符有两个&#xff0c;一个是星号&#xff0c;可以匹配\(0\)个及以上的任意字符&#xff1b; 另一个是问号&#xff0c;可以匹配恰…

jsp常用的onchange事件

定义和用法&#xff1a; onchange 事件会在域的内容改变时发生。 onchange 事件也可用于单选框与复选框改变后触发的事件。例如<input>、<select>、<textarea> <input type"text" id"name" onchange"myFunction()">&…

POJ Area of Simple Polygons 扫描线

这个题lba等神犇说可以不用离散化&#xff0c;但是我就是要用。 题干&#xff1a; DescriptionThere are N, 1 < N < 1,000 rectangles in the 2-D xy-plane. The four sides of a rectangle are horizontal or vertical line segments. Rectangles are defined by their…

window.print()打印时,如何自定义页眉/页脚、页边距

自定义页眉/页脚、页边距&#xff0c;要用到ActiveX控件&#xff08;在ie的安全设置的启用&#xff09;&#xff0c;会修改注册表中ie的设置&#xff0c;代码如下。 try{ var hkey_root,hkey_path,hkey_key; hkey_root"HKEY_CURRENT_USER"; hkey_path"\\Soft…

java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String

这个问题是&#xff0c;类型转换出错&#xff0c;为什么呢&#xff1f; 因为BigDecimal不能强制转换成 String类型&#xff0c;要用toString()转换。

String转换为int类型

在java中使用 Integer.parseInt 在js中使用 parseInt

Luogu P4205 [NOI2005]智慧珠游戏

P4205 [NOI2005]智慧珠游戏 题意 题目描述 智慧珠游戏拼盘由一个三角形盘件和\(12\)个形态各异的零件组成。拼盘的盘 件如图\(1\)所示 对于由珠子构成的零件&#xff0c;可以放到盘件的任一位置&#xff0c;条件是能有地方放&#xff0c;且尺寸合适&#xff0c;所有的零件都允许…

js中给多个class属性的标签赋值

根据ID给标签赋value值&#xff0c; document.getElementById("id").value"张三"; 当有多个class属性时&#xff0c; for(var i0;i<10;i){document.getElementsByClassName("name")[i].value"李四"; }

Cannot set property 'value' of undefined

一般情况都是js报错引起的&#xff0c;根据实际总结到&#xff1a; 1、js页面初始化时&#xff0c;执行$(document).ready(function(){})方法&#xff0c; 当你要加载的页面内容很多时&#xff0c;你的页面还未加载完&#xff0c;执行初始化函数报错。 2、在初始化函数中&…

Spring Boot + Spring Cloud 构建微服务系统(三):服务消费和负载(Feign)

Spring Cloud Feign Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持&#xff0c;包括Feign注解、JAX-RS注解。它也…

Scrapy突破反爬虫的限制

7-1 爬虫和反爬的对抗过程以及策略基本概念爬虫&#xff1a;自动获取网站数据的程序&#xff0c;关键是批量的获取反爬虫&#xff1a;使用技术手段防止爬虫程序的方法误伤&#xff1a;反爬技术将普通用户识别为爬虫&#xff0c;如果误伤过高&#xff0c;效果再好也不能用一般ip…