找到简单的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;
}
本文介绍了一个基于DFS(深度优先搜索)算法的简单实现案例。针对特定条件(如避开红色障碍物),通过递归方式标记并计数可达节点。讨论了在搜索过程中标记已访问节点的重要性,并提供了完整的C++代码实现。

495

被折叠的 条评论
为什么被折叠?



