Red and Black,POJ,1979

《Red and Black》(红与黑)是POJ(北京大学在线评测系统)上的一个经典题目,编号为1979。这道题目属于图论中的连通性问题,具体来说是求解一个无向图中的连通分量个数。

题目描述

在一个由 RC 列组成的网格中,每个格子可能是红色(用 code>@ 表示)或者黑色(用 * 表示)。红色格子是连通的,黑色格子是障碍。你需要计算连通的红色区域(连通分量)的个数。

输入

  • 第一行包含两个整数 RC,分别表示网格的行数和列数。
  • 接下来的 R 行,每行包含 C 个字符,表示网格的每个格子。

输出

  • 输出一个整数,表示连通的红色区域的个数。

示例

输入:

5 5 @@ @ @@ *@*@ @@

输出:

3

解题思路

这道题目可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来解决。以下是使用DFS的步骤:

  1. 初始化:创建一个与网格大小相同的标记数组 visited,用于记录每个格子是否已经被访问过。
  2. 遍历网格:从左上角开始遍历整个网格,对于每个红色格子(@),如果它没有被访问过,则进行DFS,并将连通分量的计数器加1。
  3. DFS过程:在DFS过程中,标记当前格子为已访问,并递归地访问其上下左右四个方向的红色格子。
  4. 输出结果:遍历完成后,连通分量的计数器的值即为所求。

代码实现(C++)

#include #include using namespace std;

const int MAXN = 100; int R, C; vector> grid(MAXN, vector(MAXN)); vector> visited(MAXN, vector(MAXN, false));

// 方向数组,用于表示上下左右四个方向 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1};

void dfs(int x, int y) { visited[x][y] = true; for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < R && ny >= 0 && ny < C && !visited[nx][ny] && grid[nx][ny] == '@') { dfs(nx, ny); } } }

int main() { cin >> R >> C; for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { cin >> grid[i][j]; } }

int count = 0;
for (int i = 0; i < R; ++i) {
    for (int j = 0; j < C; ++j) {
        if (grid[i][j] == '@' && !visited[i][j]) {
            dfs(i, j);
            count++;
        }
    }
}

cout << count << endl;
return 0;

}

注意事项

  1. 边界检查:在DFS过程中,确保访问的格子坐标在合法范围内。
  2. 标记访问:避免重复访问已经访问过的红色格子。
  3. 输入输出:注意处理输入输出格式,确保读取和输出数据的正确性。

通过以上步骤和代码实现,可以有效地解决《Red and Black》这道题目。希望这个详细的解答对你有所帮助!如果有更多问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注