BFS拐弯次数
Description
wyy是一个著名动画《境界的彼方》的男主,此时他非常的慌张,因为女主栗山未来进入了境界的彼方内部,并且花费了大量的血量去拯救wyy,wyy此时也进入了境界的彼方,他妈给了他一张地图去寻找境界的彼方的核心去拯救女主,现给你一张n×n的地图,以及男主的位置,问男主要拐弯几次才会到达境界的彼方内部(境界的彼方的位置为(n,n))
不过你以为这就是道搜索题?还得加条件:此时女主血条狂掉,你必须判断此时wyy是否可以走到终点且女主的血条不会掉光,如果掉光了那么输出"Die",如果地图无法到达境界的彼方(他妈坑他)就输出"No",如果到得了终点且女主血条活着输出res代表男主此时要拐弯几次
Input
给出n和k和\(x_1\)和\(y_1\),k代表每拐弯一次女主要耗掉k滴血, 默认女主有100点血, \(x_1\)和\(y_1\)代表男主此时所在的位置
Output
根据题目要求输出
这个题就是有一个坑就是当起点和终点一样的时候,还要注意的是他拐弯的时候掉血不是走一步掉线
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=3e3+100;
char a[maxn][maxn];
int vis[maxn][maxn];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct node{
int x,y,t;
};
int n,sx,sy,ex,ey;
ll m;
int ans=0x3f3f3f3f;
int f=0;
void BFS(){
queue<node>q;
node tmp,nxt;
tmp.x=sx,tmp.y=sy,tmp.t=-1;//因为第一步不算
vis[tmp.x][tmp.y]=1;
q.push(tmp);
while(!q.empty()){
tmp=q.front();
q.pop();
nxt.t=tmp.t+1;
for(int i=0;i<4;i++){//相当于拐了一次弯
int xx=tmp.x,yy=tmp.y;
while(1){//把这一个方向的都标记了
xx=xx+dx[i],yy=yy+dy[i];
if(xx<1||xx>n||yy<1||yy>n){
break;
}
if(a[xx][yy]=='0') break;
if(vis[xx][yy]) break;
vis[xx][yy]=1;
nxt.x=xx,nxt.y=yy;
if(xx==ex&&yy==ey){
f=1;
ans=min(ans,nxt.t);
return ;
}
q.push(nxt);
}
}
}
}
int main(){
cin>>n>>m>>sx>>sy;
ex=ey=n;
for(int i=1;i<=n;i++){
scanf("%s",a[i]+1);
}
if(sx==ex&&sy==ey){
if(a[sx][ex]=='1'){
cout<<"0"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}
BFS();
if(f==0){
cout<<"No"<<endl;
return 0;
}
if(100-1ll*m*ans<=0){
cout<<"Die"<<endl;
}
else{
cout<<ans<<endl;
}
}