找到简单的DFS题目练习。
重点是红色不但不能走,而且有红色的地方相当于墙,所以重新写了下搜索的条件。
出现一个问题就是搜索过的点一定要记得标记或者更改。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
const int maxn=100+5;
char m[maxn][maxn];
int n,k;
int val;
void dfs(int x,int y)
{
m[x][y]='#';
val++;
if(m[x+1][y]!='#' && x+1>=0 && x+1 <k && y >=0 && y < n) dfs(x+1,y);
if(m[x-1][y]!='#' && x-1>=0 && x-1 <k && y >=0 && y < n) dfs(x-1,y);
if(m[x][y-1]!='#' && x>=0 && x <k && y-1 >=0 && y-1 < n) dfs(x,y-1);
if(m[x][y+1]!='#' && x>=0 && x <k && y+1 >=0 && y+1 < n) dfs(x,y+1);
return;
}
int main()
{
while(cin >> n >> k && n)
{
for(int i=0; i<k; i++)
scanf("%s",m[i]);
val=0;
int flag=0;
for(int i=0; i<k; i++)
{
for(int j=0; j<n; j++)
{
if(m[i][j]=='@')
{
dfs(i,j);
flag=1;
break;
}
if(flag) break;
}
}
cout << val << endl;
}
return 0;
}