题目链接:https://www.hpuoj.com/contest/16/problem/C/
单测试点时限: 1.0 秒
内存限制: 512 MB
远古洪荒时期,女王Alice和战神Bob因爱相恋,一段催人泪下的爱情故事流传民间.
相传,女王Alice的美貌惊艳六界,作为对颜值颇有要求的上古灵兽Qaq芳心异动,可是女王早已许配给战神Bob,怎么会移情于己呢,而且单挑自己也不是战神Bob的对手。于是,灵兽Qaq便设计将战神Bob引入洪荒之地,种下十里桃花困住战神Bob。女王Alice得知后,冒着渡劫的天雷赶去营救……实在bian不下去了.
简言之,一个 ?×? 的迷宫,Alice站在 (1,1) 位置,Bob被困在 (?,?) 位置,迷宫中会有障碍物,规定障碍物在迷宫中不能同行且不能同列。Alice只能在迷宫中移动且不能跨越障碍物,每次只能移动一个格子且只有上下左右四个方向。
Alice能顺利解救Bob么?若成功解救输出 Yes
,并输出最少所用步数.否则输出 No
.
如图所示,A
代表Alice,B
代表Bob,#
代表障碍物,箭头代表移动的四个方向:
输入
第一行一个整数 ?,代表 ? 组测试数据.
对于每一组数据,第一行两个整数 ? 和 ?,分别表示 ?×? 迷宫大小和 ? 个障碍物,接下来 ? 行,每一行两个整数 ? 和 ?,表示障碍物坐标 (?,?)。
数据保证障碍物不同行且不同列,且不在位置 (1,1),(?,?)。
(1≤?≤2000,1≤?,?≤10000,1≤?,?≤?)
输出
对于每组测试样例,输出占一行。
若成功解救输出 Yes
,并输出最少所用步数.否则输出 No
。
样例
2 2 1 1 2 2 2 1 2 2 1
Yes 2 No
解题思路:
题目中有一句很重要的话:规定障碍物在迷宫中不能同行且不能同列,
这就表明只要障碍物不是在斜对角线中,那么就一定会有路到,并且最短为2*n-2;
只要不是这种斜对角线就行,我们数组从0开始编号,从左到右每条对角线上的数目多1.
我们只要考虑这种情况就可以了。
A | X | |||
X | ||||
X | ||||
B |
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=100000+10; int a[maxn]; int main() { int t,n,m,x,y; cin >> t; while (t--) { memset(a,0,sizeof(a)); cin >> n >> m; int flag = 0; while (m--) { cin >> x >> y; x--,y--; a[n+x+y]++; if (x+y < n) { if (a[n+x+y] == x+y+1) flag = 1; } else { if (a[n+x+y] == n*2-1-x-y) flag = 1; } } if (flag == 0) printf("Yes %d\n",n*2-2); else printf("No\n"); } return 0; }