POJ 2386 Lake Counting
题意:输入一个 n 行 m 列 的矩阵, 搜索有多少个连通 ‘W'字母块
题解:DFS。
有个疑惑,就是输入一个字符串AC,一个字母一个字母的输入会 wa
找Bug找了一个小时多,甚至怀疑过自己的算法写错了,现在都没想通
莫名其妙贡献的一发wa. 欢迎大佬看见能告诉我QAQ
#include <iostream>
#include <queue>
#include <stdio.h>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 110;
char mp[N][N];
int n,m,ans = 0;
int dir[8][2]={{-1,1},{-1,0},{-1,-1},{0,1},{0,-1},{1,1},{1,0},{1,-1}}; //八个方向
bool inbound(int x, int l, int r) //判断位置是否合法
{
if(x < l || x >= r) return false; //不合法
return true;
}
void dfs(int x, int y)
{
mp[x][y] = '.'; //访问过后覆盖
for(int i = 0; i < 8; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(!inbound(tx,0,n) || !inbound(ty,0,m)) continue; //位置不合法就结束本次循环
if(mp[tx][ty] == 'W') //递归搜索
dfs(tx,ty);
}
// return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 0; i < n; i++) scanf("%s",mp[i]);
/***
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%c",&mp[i][j]);
***/
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(mp[i][j] == 'W')
{
ans++;
dfs(i,j);
}
}
}
printf("%d\n",ans);
return 0;
}
永远年轻 永远热泪盈眶!

浙公网安备 33010602011771号