#385. 拯救王妃

 http://www.goj.wiki/p?q=385

 

非常简单,但这题不用vis,因为他有可能第二次走会更快,所以我们用timee数组,给点支持吧QwQ

 

//最近马上就讲BFS大家给点支持吧QwQ 
#include<bits/stdc++.h>
using namespace std;
struct Node
{
	int x,y,time;
};
int dx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//位移数组 
queue<Node> Q;//BFS基本操作 
int c[75][75];//map地图数组 
int timee[75][75];//看那个格子的最短时间走到要多久,后面有大用awa ,这为啥不用time呢?因为time是C++关键字 
int n,m,a,b,p;//各种数 
int ans=INT_MAX;//用来看那个时间最短 
void BFS(int x,int y)//BFS,OvO 
{
	Q.push({x,y,c[x][y]});//把第一个点存入Q中 
	timee[x][y]=c[x][y];//用timee数组把起点最短到达的时间写下来 
	while(!Q.empty())//只要Q不空,就执行 
	{
		Node t=Q.front();//用t把Q的front存下来 
		Q.pop();//把Q的第一位踢出去QwQ 
		if(t.x==a&&t.y==b)//如果到终点了 
		{ 
			ans=min(ans,t.time);//比较是之前最短的时间短还是这次短 
		}
		for(int i=0;i<=4-1;i++)//位移,启动! 
		{
			int xx=t.x+dx[i][0];//设置下一个x点 
			int yy=t.y+dx[i][1];//设置下一个y点 
			if(xx>0&&xx<=n&&yy>0&&yy<=m)//如果不出界 
			{
				if(t.time+c[xx][yy]<timee[xx][yy])//如果时间比之前短 
				{
					timee[xx][yy]=t.time+c[xx][yy];//将那个时间设为这次的 
					Q.push({xx,yy,t.time+c[xx][yy]});//将它存入Q中 
					
				}
			}		
		}		
	}
	return;
}
int main()
{	
	memset(timee,0x3f,sizeof(timee));//一定要这个,不加会错哦,因为他要设为最大值,在和那些比0的的数比 
	cin>>n>>m;//输入 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>c[i][j];//输入map数组 
		}
	}
	cin>>a>>b>>p;//输入终点和时间 
	BFS(1,1);//函数QwQ 
	if(ans<=p)
	{
		cout<<"YES"<<endl<<p-ans;//如果 到终点的最小时间比要求时间小就输出 
	}
	else
	{
		cout<<"NO";//否则输出no 
	}
	return 0;
}

马上讲BFS啦,给点支持吧...awa 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值