C - 红与黑

Posted yangf428

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 红与黑相关的知识,希望对你有一定的参考价值。

C - 红与黑

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

有一个矩形的房间,房间铺着正方形的地砖。每个地砖被涂上红色或者黑色。初始时你站在房间里的某个黑色地砖上,你每次只能移动到相邻的四个地砖之一,即上下左右移动,并且你每次只能移动到黑色的地砖上,不能走到红色地砖。
编程计算出按照上述要求你能走到的黑色地砖的个数。

Input

输入包含多组测试数据。每组测试数据第一行包括2个整数W和H;W和H是房间的宽度和长度,分别表示为房间的x和y坐标轴。W和H不大于20。接下来是H行每行W个地砖的房间,每个地砖表示如下:
‘.’——黑色地砖
‘#’——红色地砖
‘@’ ——你在房间里的初始位置(房间只出现一次)。
输入的最后一行是两个整数0,不用处理。

Output

对每个测试样例,输出一行,即你能走到的黑色地砖的个数(包括你初始站在的黑色地砖)。

Sample Input

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
[email protected]
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13





#include<cstdio>
#include<cstring>

int tox[] = {1, 0, 0, -1};
int toy[] = {0, 1, -1, 0};

char mp[25][25];
int w, h, cnt;

bool judge(int x, int y){
    // 坐标(x, y) 在图的范围内,并且为黑色地砖(‘.‘)
    if(x >= 0 && x < h && y >= 0 && y < w && mp[x][y] == .)
        return true;
    else return false;
}

void dfs(int x, int y){
    cnt++; //一个能走的,让cnt++
    mp[x][y] = #; // 把走过的变为不能走的,避免重复计算
    for(int i=0; i<4; i++){ // 枚举四连通的走法
        if(judge(x + tox[i], y + toy[i])){ // 如果下一步在图内并且可走 
            dfs(x + tox[i], y + toy[i]);
        }
    }
}

int main()
{
    while(scanf("%d%d", &w, &h) && w && h){
        for(int i=0; i<h; i++){ // 输入图
            scanf("%s", mp[i]);
        }
        cnt = 0;
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){ // 遍历寻找 @ 起点
                if(mp[i][j] == @) {
                    dfs(i, j);
                }
            }
        }
        printf("%d
", cnt);
    }
    return 0;
}

 

以上是关于C - 红与黑的主要内容,如果未能解决你的问题,请参考以下文章

I - 红与黑

1113. 红与黑

简单搜索 红与黑:

红与黑

红与黑

2806 红与黑