POJ-2386-Lake Counting-解题报告

跟“红与黑”那道题很相似,都是用递归思想解决。

这道也是自己独立解答出来的,一次就AC了,很有些成就感啊。

 

 #include <iostream> using namespace std; const int MAX_SIZE = 100; /*表示田地的矩阵,全局数据*/ char field[MAX_SIZE][MAX_SIZE]; int n, m; /*核心递归函数。 *输入:矩阵坐标i,j。 *输出:与该点相连的有几处"water",即该"pond"有几个"water". */ int count(int i, int j) { if(i < 0 || i >= n || j < 0 || j >= m) return 0; if(field[i][j] == '.') return 0; /*注意,若该点是“water",处理过后,要将该处置为"land", *以防递归时重复调用。这也使计算有几个"pond“时不会重复。 */ field[i][j] = '.'; /*根据题意,八个方向的都算在同一个"pond"*/ return 1 + count(i-1, j-1) + count(i-1, j) + count(i-1, j+1) + count(i, j-1) + count(i, j+1) + count(i+1, j-1) + count(i+1, j) + count(i+1, j+1); } int main() { cin >> n >> m; /*初始化“田地”矩阵。*/ char flag; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> flag; field[i][j] = flag; } } /*计算共有几个"pond" *注意,已被处理的"W"点,都已置为“.",因此不会出现重复情况。 */ int output = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { /*若“water"数量不为0,表示可以构成一个"pond"*/ if(count(i, j) != 0) output++; } } cout << output << endl; return 0; }

你可能感兴趣的:(output)