POJ 2386 Lake Counting
Posted edviv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",ans); return 0; }
以上是关于POJ 2386 Lake Counting的主要内容,如果未能解决你的问题,请参考以下文章