非常简单,但这题不用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