CF1214D

CF1214D

题意:

给你一个 $ n \times m $ 的矩阵,求最少用多少个障碍,将 $ (1,1) $ 到 $ (n,m) $ 的路径堵死。

题意:

因为可以将起点两边堵死,所以答案最多是 $ 2 $ ,所以答案就只有 $ 0,1,2 $ 。
先两遍DFS抠出既能从 $ (1,1) $ 到达又能到达 $ (n,m) $ 的点,看看每个步数内能到达的点是否只有一个。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define LL long long
#define N 1000010

int n,m,s,ans,f;
bool vis[N];
char ch[N];

void dfs(int x) {
    if(ans) return;
    if(x == f) {
        ans++;
        return;
    }
    int l = x / m,r = x % m;
    if(l + 1 < n && vis[(l + 1) * m + r] == 0 && ch[(l + 1) * m + r] != '#') {
        vis[(l + 1) * m + r] = 1;
        dfs((l + 1) * m + r);
    }
    if(ans) return;
    if(r + 1 < m && vis[l * m + r + 1] == 0 && ch[l * m + r + 1] != '#') {
        vis[l * m + r + 1] = 1;
        dfs(l * m + r + 1);
    }
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i = 0 ; i < n ; i++)
        scanf("%s",ch + i * m);
    f = n * m - 1,ans = 0;
    vis[s] = 1,vis[f] = 0;
    dfs(s);
    if(ans == 0) {
        puts("0");
        return 0;
    }
    vis[s] = 1,vis[f] = 0;
    ans = 0;
    dfs(s);
    if(ans == 0) puts("1");
    else puts("2");
    //system(
    return 0;
}
posted @   西窗夜雨  阅读(230)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!
· langchain0.3教程:从0到1打造一个智能聊天机器人
历史上的今天:
2018-09-05 LCT解读(1)
2018-09-05 [APIO2010]特别行动队
点击右上角即可分享
微信分享提示