题目:在一个w x h的矩形广场上,每一块1 x 1的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻且是黑色的瓷砖上。现在,他想知道,通过重复上述移动能经过的黑色瓷砖数。
数据输入:
第1行为h、w,2<=w、h<=50,之间有一个空格隔开。
以下为1个w行h列的二维字符矩阵,每个字符为“.”“#”“@”,分别表示该位置为黑色的瓷砖、红色的瓷砖、小林的初始位置。
数据输出:
输出一行一个整数,表示小林从初始位置出发可以经过的黑色瓷砖数。
题解:一道"迷宫"题,用深搜,挨个上下左右枚举,如果是黑色瓷砖,dfs。否则不管,在定义一个flag数组,记录走过没有,如果走到一个没被走过的黑色瓷砖,ans++。
#include<cstdio>
#include<iostream>
using namespace std;
char a[60][60];
bool flag[60][60];
int ans=1;
void dfs(int x,int y)//深搜函数
{
if(a[x+1][y]=='.' && !flag[x+1][y])//判断是否要dfs,下面同理
{
flag[x+1][y]=1;
ans++;//答案++
dfs(x+1,y);
}
if(a[x-1][y]=='.' && !flag[x-1][y])
{
flag[x-1][y]=1;
ans++;
dfs(x-1,y);
}
if(a[x][y+1]=='.' && !flag[x][y+1])
{
flag[x][y+1]=1;
ans++;
dfs(x,y+1);
}
if(a[x][y-1]=='.' && !flag[x][y-1])
{
flag[x][y-1]=1;
ans++;
dfs(x,y-1);
}
return;
}
int main()
{
int w,h;
cin>>h>>w;
int x,y;
//读入
for(int i=1;i<=w;i++)
{
for(int j=1;j<=h;j++)
{
cin>>a[i][j];
if(a[i][j]=='@')
{
x=i;
y=j;
}
}
}
dfs(x,y);//深搜
cout<<ans<<endl;//输出
return 0;
}