HDU-1312-Black and Red

这题其实和POJ的1979是同一道题,当时POJ使用cin写的,所以读入的时候,就很正确。
这次用scanf读入的时候,就出现了问题,我们在读完宽高之后,要用getchar吸收掉回车,然后每行末尾的回车也要用scanf吸收掉。
对于深搜函数的写法有多种,我在代码里面列了两种。

#include <cstdio>
#include <cstring>
int map[25][25];
int vis[25][25];
int sr, sc, ans, H, W;
int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

// void dfs(int r,int c)
// {
//     ans++;
//     map[r][c] = 0;
//     for (int k = 0;k<4;k++) {
//         int i = r + d[k][0];
//         int j = c + d[k][1];
//         if (i>=0&&j>=0&&i<H&&j<W&&map[i][j]) {
//             dfs(i, j);
//         }
//     }
// }

void dfs(int r,int c)
{
    if (map[r][c])
        ans++;
    for (int i=0;i<4;i++) {
        int row = r + d[i][1];
        int col = c + d[i][0];
        if (row>=0&&col>=0&&row<H&&col<W&&map[row][col]&&!vis[row][col]) {
            vis[row][col] = 1;
            dfs(row, col);
        }
    }
}

int main()
{
    char ch;
    while (scanf("%d%d",&W,&H)&&W+H) {
        getchar();
        memset(map, 0, sizeof(map));
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < H;i++) {
            for (int j = 0; j < W;j++) {
                scanf("%c", &ch);
                if (ch=='.')
                    map[i][j] = 1;
                else if (ch=='@') {
                    sr = i;
                    sc = j;
                    map[i][j] = 1;
                }
            }
            getchar();
        }
        // for (int i = 0; i < H;i++) {
        //     for (int j = 0; j < W;j++) {
        //         printf("%d", map[i][j]);
        //     }
        //     printf("
");
        // }
        ans = 0;
        vis[sr][sc] = 1;
        dfs(sr,sc);
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/10350129.html