第九届河南理工大学算法程序设计大赛 C. Asia区域宫

题目链接:https://www.hpuoj.com/contest/16/problem/C/

Problem  Description:

单测试点时限: 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,# 代表障碍物,箭头代表移动的四个方向:

Input:

 

第一行一个整数 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)

Output:

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

Sample  Input:

2
2 1
1 2
2 2
1 2
2 1

Sample  Output:

Yes 2
No

思路:被这道题套路了,掉进了bfs的坑里无法自拔。其实这道题压根儿就没用到bfs的知识点,题目上一个最重要的一句话被我选择性忽略了,障碍物在迷宫中不能同行且不能同列,(没错,这就是欺骗我感情的15个字儿,我算是记住你了),所以按最优解的情况,只要障碍物不是在斜着的一排上都可以到达终点,而且最少步数是 2*n-2 步

(因为障碍物只可能在当前位置的右边和下边其中一个,当然也可能是左边或上边,但为了使步数最少,不会往回走,所以这种情况就不考虑了,因此若障碍物在右边就走下边,若在下边就走右边,无论是哪种情况,步数都是1,所以最少步数就是2*n-2步)

接着就是如何判断障碍物是不是在斜着的一排上,当 x1+y1=x2+y2时,这两个格子在同一斜线。

My  Code:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<set>
using namespace std;
#define INF 1e9
typedef long long ll;

const int MOD = (int)1e9 + 7;

int main() {

    int t;
    cin >> t;
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int x[10005],y[10005],k=0;
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d",&x[i],&y[i]);
            if(i > 0)
            {
                if(x[i]+y[i] != x[0] + y[0])
                    k = 1;
            }
        }
        if(k == 0 && m > 1 && m == x[0]+y[0]-1)
            printf("No\n");
        else printf("Yes %d\n",2*n-2);
    }
    
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值