牛客寒假算法基础集训营4C Applese 走迷宫(BFS)

链接:https://ac.nowcoder.com/acm/contest/330/C
来源:牛客网
 

题目描述

精通程序设计的 Applese 双写了一个游戏。

在这个游戏中,它被困在了一个 n×m的迷宫中,它想要逃出这个迷宫。

在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。
 

在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。

已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间。

输入描述:

第一行两个正整数 n, m 表示迷宫的大小。
接下来 n 行,每行长度为 m 的字符串。描述地图。
其中 'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。
保证地图中的起点和终点只有一个,道具都位于空地。

输出描述:

输出一个整数,表示 Applese 走出迷宫的最短时间。特别地,如果 Applese 走不出迷宫,输出 "-1"。

示例1

输入

复制

5 5
.w@..
.S#..
~w#..
.w..~
@w.~T

输出

复制

18

备注:

1≤n,m≤100

除了坐标之外还多了一个关于水属性,火属性的状态,然后就是模板一样的bfs(。)

不多港了

#include <iostream>
#include <queue>
using namespace std;
char a[110][110]={0};
bool flag[110][110][2]={0};//坐标,状态
int b[4]={1,0,-1,0};
int d[4]={0,1,0,-1};
struct st{
	
	int x,y,step;
	bool h;
	st(int a,int b,int c,bool d):x(a),y(b),step(c),h(d){};

}; 
int main()
{
	ios::sync_with_stdio(false);
	
	int n,m,i,j;
	
	cin>>n>>m;
	
	int sx,sy,ex,ey;
	
	for(i=1;i<=n;i++){
		
		for(j=1;j<=m;j++){
			
			cin>>a[i][j];
			
			if(a[i][j]=='S'){
				
				sx=i;
				sy=j;
				
			}
			
			if(a[i][j]=='T'){
				
				ex=i;
				ey=j;
				
			}
			
		}
	
	}
	
//'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。 
	 
	queue <st> qe;
	
	qe.push(st(sx,sy,0,1));//1水,0 火 
	
	flag[sx][sy][1]=1;
	
	bool f=1;
	
	while(!qe.empty()){
		
		st t=qe.front();
		
		qe.pop();
		
		if(t.x==ex&&t.y==ey){
			
			cout<<t.step<<endl;
			f=0;
			break;
		}
		
		if(a[t.x][t.y]!='#'){
			
			for(i=0;i<4;i++){
				
				int x=t.x+b[i],y=t.y+d[i];
				
				if(flag[x][y][t.h]) continue;
				
				if(x<=n&&x>0&&y>0&&y<=m){
				
					if(a[x][y]=='.'||a[x][y]=='S'||a[x][y]=='T'||a[x][y]=='@'){
						flag[x][y][t.h]=1;
						qe.push(st(x,y,t.step+1,t.h));
					}
	
					if(a[x][y]=='w'&&!t.h){
					
						qe.push(st(x,y,t.step+1,t.h));
						flag[x][y][t.h]=1;
					
					}
				
					if(a[x][y]=='~'&&t.h){
					
						qe.push(st(x,y,t.step+1,t.h));
						flag[x][y][t.h]=1;
					
					}
				
				
				}							
							
			}
			
			
		}
		
		if(a[t.x][t.y]=='@'){
			
			if(!flag[t.x][t.y][!t.h]){
				
				qe.push(st(t.x,t.y,t.step+1,!t.h));
				
				flag[t.x][t.y][!t.h]=1;
				
			}
			
			
		}	
		
		
	}
	
	if(f){
		
		cout<<"-1"<<endl;
	}
	
	return 0;
	
}
发布了48 篇原创文章 · 获赞 1 · 访问量 4573

猜你喜欢

转载自blog.csdn.net/tsunagxy/article/details/86776065
今日推荐