题目链接:http://bailian.openjudge.cn/practice/2816?lang=en_US
总时间限制: 1000ms 内存限制: 65536kB

描述

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入

包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。

输出

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

样例输入

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

样例输出

45

解题思路

题意:给定一点,计算它所在的连通区域的面积。
思路:设f(x, y)为从点(x,y)出发能够走过的黑瓷砖总数,则f(x,y)=1+f(x−1,y)+f(x+1,y)+f(x,y−1)+f(x,y+1),凡是走过的瓷砖不能够被重复走。

Accepted Code:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 25;
char mp[MAXN][MAXN];
int n, m, dir[][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int DFS(int x, int y) {
    mp[x][y] = '#';
    int tx, ty, ans = 1;
    for (int i = 0; i < 4; i++) {
        tx = x + dir[i][0];
        ty = y + dir[i][1];
        if (tx >= 0 && tx < m && ty >= 0 && ty < n && mp[tx][ty] != '#') {
            mp[tx][ty] = '#';
            ans += DFS(tx, ty);
        }
    }
    return ans;
}
int main() {
    int ex, ey;
    while (scanf("%d%d", &n, &m), n + m) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                scanf(" %c", &mp[i][j]);
                if (mp[i][j] == '@')
                    ex = i, ey = j;
            }
        }
        printf("%d\n", DFS(ex, ey));
    }
    return 0;
}