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("\n");
        // }
        ans = 0;
        vis[sr][sc] = 1;
        dfs(sr,sc);
        printf("%d\n", ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值