1. 程式人生 > >Bailian2816 紅與黑【DFS】

Bailian2816 紅與黑【DFS】

2816:紅與黑
總時間限制: 1000ms 記憶體限制: 65536kB
描述
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。
輸入
包括多個數據集合。每個資料集合的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字元。每個字元表示一塊瓷磚的顏色,規則如下
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。
輸出


對每個資料集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。
樣例輸入
6 9
....#.
.....#
......
......
......
......
......

@...

.#..#.
0 0
樣例輸出
45
來源
1979

問題連結Bailian2816 紅與黑
問題描述:(略)
問題分析
    這是一個可以用DFS解決的問題,不解釋了。
程式說明
    本題與參考連結是同一題,使用參考連結的程式提交就AC了。
參考連結POJ1979 HDU1312 Red and Black【DFS】


題記:朋友交多了,容易遇見熟人。

AC的C語言程式如下:

/* POJ1979 Red and Black */

#include <stdio.h>
#include <memory.h>

#define DIRECTSIZE 4

struct direct {
    int drow;
    int dcol;
} direct[DIRECTSIZE] =
    {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};

#define MAXN 20

char grid[MAXN+2][MAXN+2];
int count;

void dfs(int row, int col)
{
    int i;

    for(i=0; i<DIRECTSIZE; i++) {
        int nextrow = row + direct[i].drow;
        int nextcol = col + direct[i].dcol;

        if(grid[nextrow][nextcol] == '.') {
            count++;

            grid[nextrow][nextcol] = '#';

            dfs(nextrow, nextcol);
        }
    }
}

char getmychar()
{
    char c;

    while((c=getchar()) && (c == '\n' || c == '\t' || c == ' '));

    return c;
}

int main(void)
{
    int w, h, startrow, startcol, i, j;

    while(scanf("%d%d", &w, &h) != EOF) {
        // 結束條件
        if(w == 0 && h == 0)
            break;

        // 清零:邊界清零
        memset(grid, 0, sizeof(grid));

        // 讀入資料
        for(i=1; i<=h; i++)
            for(j=1; j<=w; j++) {
                grid[i][j] = getmychar();
                if(grid[i][j] == '@') {
                    startrow = i;
                    startcol = j;
                    grid[i][j] = '#';
                }
            }

        // 計數置1
        count = 1;

        // 深度優先搜尋
        dfs(startrow, startcol);

        // 輸出結果
        printf("%d\n", count);
    }

    return 0;
}