不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一 条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有 喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中 的任何一个上,但它也必须是安全的才行。由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全 的,并且她会指引你飞到第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;
}