C. Asia区域宫

单测试点时限: 1.0 秒

内存限制: 512 MB

远古洪荒时期,女王Alice和战神Bob因爱相恋,一段催人泪下的爱情故事流传民间.
相传,女王Alice的美貌惊艳六界,作为对颜值颇有要求的上古灵兽Qaq芳心异动,可是女王早已许配给战神Bob,怎么会移情于己呢,而且单挑自己也不是战神Bob的对手。于是,灵兽Qaq便设计将战神Bob引入洪荒之地,种下十里桃花困住战神Bob。女王Alice得知后,冒着渡劫的天雷赶去营救……实在bian不下去了.
简言之,一个 n×n 的迷宫,Alice站在 (1,1) 位置,Bob被困在 (n,n) 位置,迷宫中会有障碍物,规定障碍物在迷宫中不能同行且不能同列。Alice只能在迷宫中移动且不能跨越障碍物,每次只能移动一个格子且只有上下左右四个方向。
Alice能顺利解救Bob么?若成功解救输出 Yes,并输出最少所用步数.否则输出 No.
如图所示,A 代表Alice,B 代表Bob,# 代表障碍物,箭头代表移动的四个方向:

输入

第一行一个整数 T,代表 T 组测试数据.
对于每一组数据,第一行两个整数 n 和 m,分别表示 n×n 迷宫大小和 m 个障碍物,接下来 m 行,每一行两个整数 x 和 y,表示障碍物坐标 (x,y)。
数据保证障碍物不同行且不同列,且不在位置 (1,1),(n,n)。
(1≤T≤2000,1≤m,n≤10000,1≤x,y≤n)

输出

对于每组测试样例,输出占一行。
若成功解救输出 Yes,并输出最少所用步数.否则输出 No 。

样例

input

2
2 1
1 2
2 2
1 2
2 1

output

Yes 2
No
    乍看一眼或许好多人都写成bfs了,但是一直会超时,所以本题用bfs是行不通的。
注意本题的一个提示(数据保证障碍物不同行且不同列)。即不能达到终点的情况
就是矩阵的副对角线以及与副对角线平行的位置上都充满障碍物,这样才不能到达
。哪怕副对角线上有一个缺口都是可以到达滴。
    还有一个要点是这个矩阵是方阵。而能到达终点的情况都可以转化为一横一竖的路径
即总长为2*(n-1)

    而判断是否在矩阵的副对角线以及与副对角线平行的位置上,只需判断,x+y的值就行了
因为这些位置上的值都是相等的。而我们要做的就是统计这些点的个数就行了
#include<bits/stdc++.h>

using namespace std;

struct node
{
	int x,y;//保存障碍物的位置 
	int sum;
}a[10005];

int main()
{
	int t;
	scanf("%d",&t);
	while (t--)
	{
		int n,m,k,s1 = 0,x;
		scanf("%d %d",&n,&m);
		for (int i=0;i<m;i++)
		{
			scanf("%d %d",&a[i].x,&a[i].y);
			a[i].sum = a[i].x + a[i].y;
			if (a[i].x==1)
			{//标记第一行上障碍物的位置,因为封死的情况是从右上到左下的 
				s1 = a[i].sum;//只有第一行上出现障碍物才可能封死 
				x = a[i].y;//y坐标就是这条线上封死情况下出现障碍物的个数 
			}
		}
		k = 0; // 
		for (int i=0;i<m;i++)
		{
			if (a[i].sum==s1)
				k++; 
		}
		if (x==k)
			printf("No\n");
		else
		{
			int ans = 2 * (n - 1);
			printf("Yes %d\n",ans);
		}
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40912854/article/details/88958538