Description
米基家的后院养着一群羊,米基由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符‘.’表示空地,‘#’表示栅栏,‘o’表示羊,‘v’表示狼,羊和狼所在的格子都是空地。
如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地B,则称空地A和空地B属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。
当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。
写一个程序统计战斗结束后所有羊圈中羊的总数和狼的总数。
Input
输入文件的第一行包含两个用空格隔开的自然数R和C,其中3≤R,C≤250,R表示米基家后院的行数,C表示列数,接下来的R行每行包含C个字符,每个字符表示一个格子的情况。
Output
输出文件仅一包含两个用一个空格隔开的整数,表示要求的羊的数量和狼的数量。
9 12
.###.#####..
#.oo#...#v#.
#..o#.#.#.#.
#..##o#...#.
#.#v#o###.#.
#..#v#....#.
#...v#v####.
.####.#vv.o#
.......####.
-
Sample Input
3 5
-
Sample Output
显然是DFS.
注意不属于羊圈的情况.
#include <iostream>
#include <cstdio>
#define SIZE 310
using namespace std;
int a, b;
char c[SIZE][SIZE];
bool flag;
void dfs(int x, int y) // 深搜
{
if (!c[x][y]) // 越界,不熟与羊圈,顺便标记
{
flag = true;
return;
}
if (c[x][y] == '#') // 障碍物,返回
{
return;
}
if (c[x][y] == 'o') // 遇到羊,计数器增加
{
++a;
}
else if (c[x][y] == 'v') // 遇到狼,计数器增加
{
++b;
}
c[x][y] = '#'; // 防止返回这个点
dfs(x + 1, y); // 往四个方向继续搜索
dfs(x - 1, y);
dfs(x, y + 1);
dfs(x, y - 1);
return;
}
int main(void)
{
int n, m, i, j, x = 0, y = 0;
scanf("%d%d", &n, &m);
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= m; ++j)
{
cin >> c[i][j];
}
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= m; ++j)
{
if (c[i][j] != '#') // 不是障碍
{
flag = false;
a = b = 0; // 计数器归零
dfs(i, j);
if (!flag) // 必须保证这个联通块是一个羊圈
{
if (a > b) // 羊多,最后只剩下羊
{
x += a;
}
else // 狼多,最后只剩下狼
{
y += b;
}
}
}
}
}
printf("%d %d", x, y);
return 0;
}