入门(bfs/dfs)

不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一 条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有 喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中 的任何一个上,但它也必须是安全的才行。由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全 的,并且她会指引你飞到第1块砖上(第1块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果 你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。注意 :瓷砖可以重复走过,但不能重复计数。

Format

Input

第1行两个正整数W和H,分别表示小路的宽度W和长度H,W和H都不大于20。 以下H行为一个H*W的字符矩阵。每一个字符代表一块瓷砖。 其中,“.”代表安全的砖,“#”代表不安全的砖,“@”代表第1块砖。

Output

输出一行,只包括一个数,即你从第1块砖开始所能安全走过的最多的砖块个数(包括第1块砖)。

思路:从@开始搜索,一直搜索到不能搜索为止,再输出当前步数

CODE:

1、dfs

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,zx[4]= {1,-1,0,0},zy[4]= {0,0,1,-1};
char a[30][30];
void dfs(int x,int y) {
	a[x][y]='#';//搜索过的都标记成不能走
	ans++;
	for(int i=0; i<4; i++) {
		int dx=i+zx[i],dy=j+zy[i];//上下左右搜索
		if(dx>0&&dx<=m&&dy>0&&dy<=n&&a[dx][dy]=='.')//判断是否能走
			dfs(dx,dy);
	}
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++)
			cin>>a[i][j];
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++) {
			if(a[i][j]=='@') {
				dfs(i,j);
				cout<<ans<<endl;
				break;
			}
		}

	return 0;
}

2、bfs

#include<bits/stdc++.h>
using namespace std;
int n,m,ans=1,h[110][2],zx[4]= {1,-1,0,0},zy[4]= {0,0,1,-1};
char a[30][30];
bool f[30][30];
void bfs(int x,int y) {
	int head=1,tail=1;//头结点和尾节点
	h[1][0]=x,h[1][1]=y;//进队列
	while(head<=tail) {
		for(int i=0; i<4; i++) {
			int dx=h[head][0]+zx[i],dy=h[head][1]+zy[i];
			if(f[dx][dy]) {//如果能走
				f[dx][dy]=false;//标记不能重复走
				tail++,ans++;
				h[tail][0]=dx,h[tail][1]=dy;//进队列
			}
		}
		head++;//换一个对象继续搜索
	}
}
int main() {
	cin>>n>>m;
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++) {
			cin>>a[i][j];
			if(a[i][j]=='.')
				f[i][j]=true;
		}
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++) {
			if(a[i][j]=='@') {
				bfs(i,j);
				cout<<ans<<endl;
				return 0;
			}
		}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_55599629/article/details/120102815