[Luogu1979][NOIP2013]华容道(BFS+SPFA)】的更多相关文章

考虑从起点到终点的过程,一定是先将空格子移到指定格子旁边,和指定格子交换,再移到下一个指定格子要到的地方,再交换,如此反复. 于是问题分为两个部分: 1.给定两个曼哈顿距离为2的格子求最短路,BFS即可. 2.根据1的结果决定从起点到终点的路径,使用SPFA求解. 其中,第一个问题空格子显然不能经过指定格子,BFS过程中需要特判.第二个问题的状态为(x,y,k),表示当前指定格子在(x,y),空格子在它的哪个方向(1<=k<=4). #include<cstdio> #includ…
http://172.20.6.3/Problem_Show.asp?id=1442 想到最短路的简直神了,如果我写我大概只能写一个30分的bfs. 从数据范围可以看出思路是bfs剪枝,但这里的剪枝是通过最短路的预处理实现的. 设需要移动的格子为a格子. 对求最小移动数有意义的移动只有两种,一种是空白格子的移动,一种是a格子移动到空白格子里. 可以得知要把空白格子移动到a格子旁边然后对a格子进行移动. 那么我们有了每次查找时进行的预处理1:求空白格子到a格子四周格子的最短路. 在模拟移动的过程中…
[NOIP2013]华容道 [题目描述] 这道题根据小时候玩华容道不靠谱的经验还以为是并查集,果断扑街.考后想想也是,数据这么小一定有他的道理. 首先由于是最小步数,所以BFS没跑了.那么我们大可把这道题分为两部分,首先先把白格子移到目标棋子附近,然后再把目标棋子移过去.第一步是很容易的,随便BFS一下就好了,关键是第二步.由于q不小,我们不可能每次询问都直接爆搜,但由于棋盘并不会发生本质改变,我们可以对一些东西进行预处理. 那每次询问时不变的是什么呢,我们求第二步时需要的又是什么呢? 首先我们…
[NOIP2013]华容道 首先是一种比较显然的做法. 整个棋盘,除了起点,终点和空格,其他的方块是等价的. 对于终点,它始终不会变化,如果搜到终点结束搜索即可,所以我们不需要考虑终点. 所以需要考虑的是空格的位置和起点方块的位置. 定义$f(i1,j1,i2,j2)$为 空格所在坐标$(i1,j1)$  起点坐标$(i2,j2)$. 对于每一步,可以移动空格周围的一个可移动棋子,将它与空格位置交换.其实等价于空格移动到和空格相邻的棋子.如果该棋子是起点,则将起点更新到原来空格的坐标. 使用bf…
LOJ2613 NOIP2013 华容道 LINK 这是个好题,具体题意比较麻烦可以直接看LINK中的链接 然后考虑我们可能的移动方式 首先我们需要把白块移动到需要移动块S的附近(附近四格) 然后我们就可以考虑怎么对S进行移动 操作一:把S和白块互换位置 操作二:把白块从S的一个方向移动到另一方向(方便交换位置) 第一种操作的代价是1很显然,后一种操作我们每次移动的最小代价是可以预处理的 然后我们就可以定义状态x,y,dir表示S在(x,y)且白块在S的dir方向上 我们就只需要考虑在状态之间进…
codevs 3290华容道 3290 华容道 2013年NOIP全国联赛提高组 时间限制: 1 s  空间限制: 128000 KB 题目描述 Description 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间.小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每…
描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白…
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> #define inf 0x3f3f3f3f #define N 35 #define maxn 5000 #define mod 1000000007 #define ll long long using namespace std; int n,m,q,cte; ]; ,,,}; ,,,-}; struct…
调死我了-- 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能经过当前枚举的中心格子的,然后把中心格子和它的四联通格子建边权为1的边 注意这里用来建边的点,是(x,y,k),表示当前在格子(x,y),空白格子在k方向 然后对于询问,先bfs出把空白格子移动到起始格子周围的步数,然后再spfa即可 然后对于 #include<iostream> #includ…
n<=30 * m<=30 的地图上,0表示墙壁,1表示可以放箱子的空地.q<=500次询问,每次问:当空地上唯一没有放箱子的空格子在(ex,ey)时,把位于(sx,sy)的箱子移动到(tx,ty)的最小步数. Solution 一开始听说这道题很难,所以刚拿到题就开始打暴力,emmm... 比较.....的思路是记录当前点的位置和空白点的位置,然后暴力转移. 但这个状态十分没有必要,因为我的位置能动的前提是空格在我的当前位置的旁边. 所以我们把状态变成当前点的位置和空白点在当前点的什么…