站外爆林题求助
  • 板块题目总版
  • 楼主krjt
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/5/26 21:59
  • 上次更新2023/10/28 00:34:16
查看原帖
站外爆林题求助
691537
krjt楼主2022/5/26 21:59

题目描述

鹏鹏在一个迷宫里困住了。

迷宫是长方形的,有 n 行 m 列个格子。一共有 3 类格子,空地用字符. 表示,墙壁用#表示,陷阱用*表示。

特别地,迷宫中有两个特殊的格子:起点用S表示;终点用E表示。 起点和终点都是空地。(S和E均为大写字母)

鹏鹏的任务是:从起点出发,沿着某条路径,走到终点。

游戏对路径的要求有三条:每次只能向相邻格子(上/下/左/右)移动一步;不能经过墙壁(即可以经过空地和陷阱);不能走出迷宫边界。

聪明的你请告诉鹏鹏,他能完成任务吗?如果能,鹏鹏能否不经过任何陷阱就完成任务呢?

输入格式

第一行为两个整数 n,m(2≤n,m≤7)。

接下来有 n 行,每行是一个长度为 m 的字符串,依次表示迷宫的每一行格子。

输出格式

有一行,是一个字符串。

如果鹏鹏可以不经过任何陷阱就到达终点,输出”GOOD”;

否则,如果经过 若干陷阱能到达终点,输出”OK”;

否则,输出”BAD”。(所有字母均为大写)

样例

输入

3 4
##.E
S*.#
...*

输出

GOOD

输入2

3 3
##E
S*.
#..

输出2

OK

我的代码:

#include <iostream>
using namespace std;
char g[10][10];
bool vis[10][10];
int P0[5]={0,1,0,-1};
int P1[5]={1,0,-1,0};
int sx,sy,fx,fy;
bool b1,b2;
int n,m;
void dfs(int x,int y)
{
	int kx,ky;
	if(x==fx&&y==fy)
	{
		b1=true;
		return ;
	}
	for(int i=0;i<=3;i++)
	{
		kx=x+P0[i];
		ky=y+P1[i];
		if(kx<1||kx>n||ky<1||ky>m)continue;
		if((g[kx][ky]=='.'||g[kx][ky]=='E')&&vis[kx][ky]==false)
		{
			vis[kx][ky]=true;
			dfs(kx,ky);
			vis[kx][ky]=false;
		}
	}
}
void dfs2(int x,int y)
{
	int kx,ky;
	if(x==fx&&y==fy)
	{
		b2=true;
		return ;
	}
	for(int i=0;i<=3;i++)
	{
		kx=x+P0[i];
		ky=y+P1[i];
		if(kx<1||kx>n||ky<1||ky>m)continue; 
		if((g[kx][ky]=='.'||g[kx][ky]=='E'||g[kx][ky]=='*')&&vis[kx][ky]==false)
		{
			vis[kx][ky]=true;
			dfs2(kx,ky);
			vis[kx][ky]=false;
		}
	}
}
int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>g[i][j];
			if(g[i][j]=='S')
			{
				sx=i;
				sy=j;
			}
			if(g[i][j]=='E')
			{
				fx=i;
				fy=j;
			}
		}
	}
	vis[sx][sy]=true;
	dfs(sx,sy);
	if(b1==true)cout<<"GOOD";
	else
	{
		dfs2(sx,sy);
		if(b2==true)cout<<"OK";
		else cout<<"BAD"; 
	}
    return 0;
}

备注:由于刚刚不小心发错了,重发一个

2022/5/26 21:59
加载中...