洛谷 U138573 序章&第一章 黑暗时代(eviltime)

洛谷 U138573 序章&第一章 黑暗时代(eviltime)

洛谷传送门

题目背景

“博士,你醒了。”

“抓住我的手”

“你还能回忆起自己的名字吗”

“不能吗……这样啊……”

![image-20201031083806861](file:///C:/%5CUsers%5CQYB%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20201031083806861.png)

“欢迎回来,Dr.不能”

“欢迎回来,Dr.qwq”

题目描述

游戏中,玩家扮演的是一个因故失忆的博士(刀客塔)。

你被困在了敌人曾经的老巢——切尔诺伯格,而现在的任务则是逃出来,回到你属于的罗德岛

切城的道路错综复杂,大体形成了一个网状的结构。

每两条路的交叉点叫做一个节点,而所有的边交叉在一起便形成了一个 n * mnm矩阵

而现在,在天灾的作用下,每秒钟都会有节点被摧毁。节点被摧毁后将会无法通行。

为了更高效地撤离,随行的术士算出了每个节点将要被摧毁的时间。Amiya告诉你,你曾是泰拉世界在研究矿石病方面最权威的专家——你也曾多次带着自己的小队突破那一道道看似不可能突破的难关……

而这一次,你能成功吗?

输入格式

第一行两个整数NN MM表示切城的道路大体上可以描述成一个NMNM*的矩阵

接下来NN行,每行MM个整数,表示节点会在第a_{i,j}a**i,j分钟被摧毁

特别地,若当前节点的值为0,则代表它早已被摧毁。

输出格式

一行,小队通过的最短时间。若无法通过,输出“N0”(不包含引号)。


题解:

SB题,SB人,超级SB出题人

经典宽搜。

坑点很多,包括但不完全是:

N0而非No。

代码:

#include<cstdio>
#include<queue>
#define int long long
using namespace std;
char *p1,*p2,buf[100000];
#define nc() getchar()
int read()
{
	int x=0,f=1;
	char ch=nc();
	while(ch<48||ch>57)
		if(ch=='-')
			f=-1,ch=nc();
	while(ch>=48&&ch<=57)
		x=x*10+ch-48,ch=nc();
	return x*f;
}
const int maxn=1e4+10;
const int maxm=1010;
int n,m;
int a[maxn][maxm];
bool vis[maxn][maxm];
int dx[]={0,0,0,-1,1};
int dy[]={0,1,-1,0,0};
struct node
{
	int x,y,d;
};
queue<node> q;
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%lld",&a[i][j]);
	if(a[n][m]<=0)
	{
		puts("N0");
		return 0;
	}
	node b;
	b.x=n;b.y=m;b.d=0;vis[n][m]=1;
	q.push(b);
	while(!q.empty())
	{
		node u=q.front();
		q.pop();
		if(u.x==1 && u.y==1)
		{
			printf("%lld
",u.d);
			return 0;
		}
		node v;
		for(int i=1;i<=4;i++)
		{
			int xx=u.x+dx[i];
			int yy=u.y+dy[i];
			int dd=u.d+1;
			if(xx<1 || yy<1 || xx>n || yy>m || vis[xx][yy] || dd>=a[xx][yy])
				continue;
			v.x=xx;
			v.y=yy;
			v.d=dd;
			q.push(v);
			vis[xx][yy]=1;
		}
	}
	puts("N0");
	return 0;
}
原文地址:https://www.cnblogs.com/fusiwei/p/13963907.html