Timus Online Judge 1033 Labyrinth

实在不好意思,这道题目虽然难度是系数是200度,不过也是一道水题。

题目大意:给一个迷宫,有两个入口(1, 1)和(N, N)。这个迷宫被被墙给围着或者隔开。最多从两个从两个入口进入,能往上下左右四个方向移动,求能看到墙的最大的面积。墙高是3个单位,每个格子的宽度也是3个单位。其中(1, 1)和(N, N)因为是入口,各会少两面墙。

很容易看出的,某一段墙和某一个格子相邻,若这个格子只被走一次,那么这面墙也只会被计算一次。我们只用计算所有能到达的格子所相邻的所有的墙的长度,然后答案再乘以9就可以了。因为数据量不大,所以,无论你是用深搜或者广搜都无所谓,个人觉得。我是写的深搜。

奉上代码,请多指教。

#include <iostream>
#include <cstdio>
#define pii pair<int, int>
#define x first
#define y second
#define debug(x) cout << #x << " : " << x << endl;  
using namespace std;
char maze[35][35];
int N, dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
bool is_legal(pii a) {
    return maze[a.x][a.y] == '.';
}
int dfs(pii p) {
    maze[p.x][p.y] = '*';
    int ans = 0;
    for (int i = 0; i < 4; ++i) {
        pii t = pii(p.x + dir[i][0], p.y + dir[i][1]);
        ans += maze[t.x][t.y] == '#';
        if (is_legal(t)) ans += dfs(t);
    }
    return ans;
}
int main() {
    cin >> N;
    for (int i = 0; i <= N + 1; ++i) {
        maze[0][i] = maze[i][0] = '#';
        maze[N + 1][i] = maze[i][N + 1] = '#';
    }
    for (int i = 1; i <= N; ++i) {
        getchar();
        for (int j = 1; j <= N; ++j) scanf("%c", &maze[i][j]);
    }
    int ans = 0;
    if (maze[1][1] == '.') ans += dfs(pii(1, 1));
    if (maze[N][N] == '.') ans += dfs(pii(N, N));
    cout << (ans - 4) * 9 << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值