[Codeforces 1214D]Treasure Island(dfs)
[Codeforces 1214D]Treasure Island(dfs)
题面
给出一个n*m的字符矩阵,'.'表示能通过,'#'表示不能通过。每步可以往下或往右走。问至少把多少个'.'变成'#',才能让从(1,1)出发不能到达(n,m)
\(n \times m \leq 10^6\)
分析
第一眼还以为是最小割,一看数据范围感觉会TLE。实际上搜索就可以了。
首先发现答案肯定是0,1,2中的一个(输出rand()%3),因为最多用2个'#',把(1,1)右侧和下方堵住就可以了。
然后注意到若存在一个点满足所有(1,1)到(n,m)的路径都经过那个点,那答案就为1.这实际上是一个有向图求割点的问题,类似HDU3313.
我们只需要dfs一遍,找出任意一条(1,1)到(n,m)的路径,然后把路径上的点标记为1。注意若(1,1)不能到(n,m),直接输出0.第二次dfs保证不经过路径上的点。如果第二次的时候(1,1)不能到(n,m),那就说明存在割点,答案为1。否则答案为2.
注意到数据范围\(n \times m \leq 10^6\),没有给出n,m的范围,所以要用vector存储字符矩阵。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 1000000
using namespace std;
int n,m;
char in[maxn+5];
vector<char>s[maxn+5];
struct node{
int x;
int y;
node(){
}
node(int _x,int _y){
x=_x;
y=_y;
}
};
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
vector<bool>vis[maxn+5];
vector<bool>mark[maxn+5];
bool dfs(int x,int y){
if(x>n||y>m) return 0;
if(x==n&&y==m) return 1;
if(s[x][y]=='#'||vis[x][y]||mark[x][y]) return 0;
vis[x][y]=1;
bool flag=dfs(x+1,y);
if(!flag) flag=dfs(x,y+1);
//优先往(x+1,y)走,如果走不通再往(x,y+1)走,这样就可以避免被堵住的情况,详见评论区
if(flag) mark[x][y]=1;
return flag;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",in+1);
s[i].resize(m+1);
for(int j=1;j<=m;j++) s[i][j]=in[j];
vis[i].resize(m+1);
mark[i].resize(m+1);
}
bool flag=dfs(1,1);
if(!flag) printf("0\n");
else{
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) vis[i][j]=0;
}
mark[1][1]=mark[n][m]=0;
flag=dfs(1,1);
if(!flag) printf("1\n");
else printf("2\n");
}
}
[Codeforces 1214D]Treasure Island(dfs)的更多相关文章
- Treasure Island DFS +存图
All of us love treasures, right? That's why young Vasya is heading for a Treasure Island. Treasure I ...
- Codeforces 106D Treasure Island 预处理前缀+暴力(水
主题链接:点击打开链接 意甲冠军: 特定n*m矩阵 # 是墙 . 和字母是平地 最多有26个字母(不反复出现) 以下k个指令. 每一个指令代表移动的方向和步数. 若以某个字母为起点,依次运行全部的指令 ...
- D. Treasure Island
D. Treasure Island dfs大法好== 写半天bfs疯狂MLE dfs标记掉路上的一些点 然后再跑一遍dfs #include<bits/stdc++.h> using n ...
- Gym 100971A Treasure Island BFS 思维题
A - Treasure Island Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- [Codeforces 1201D]Treasure Hunting(DP)
[Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...
- [Codeforces 163D]Large Refrigerator (DFS+剪枝)
[Codeforces 163D]Large Refrigerator (DFS+剪枝) 题面 已知一个长方体的体积为V,三边长a,b,c均为正整数,求长方体的最小表面积S V以质因数分解的形式给出 ...
- CodeForces - 1214D D. Treasure Island
题目链接:https://vjudge.net/problem/2728294/origin 思路:可以抽象成管道,先试试能不能找到一个通道能通到终点, 如果可以则封锁这个通道,一个石头即可, 再试试 ...
- Treasure Island(两遍dfs)-- Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
题意:https://codeforc.es/contest/1214/problem/D 给你一个n*m的图,每次可以往右或者往下走,问你使(1,1)不能到(n,m)最少要放多少 ‘ # ’ . 思 ...
- Pursuit For Artifacts CodeForces - 652E (Tarjan+dfs)
Pursuit For Artifacts CodeForces - 652E Johnny is playing a well-known computer game. The game are i ...
随机推荐
- 【leetcode database】Human Traffic of Stadium
X city built a new stadium, each day many people visit it and the stats are saved as these columns: ...
- 一张图解释Linux文件系统中硬链接和软链接的区别
如图所示,硬链接与原始文件共用一个inode,但inode是不跨文件系统的(Ext3.Ext4),每个文件系统都有自己的inode列表.因此,硬链接是没办法跨文件系统的 而软链接不同,软链接相当于重新 ...
- 实战build-react(三)+ style-components
npm install --save style-components https://www.jianshu.com/p/27788be90605(copy) "axios": ...
- HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)
题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...
- python3.7--pycharm selenium自启360浏览器/360极速浏览器方法
写于:2019.01.02(实测日) 参考文档:https://blog.csdn.net/five3/article/details/50013159 一.下载360浏览器或360极速浏览器的Chr ...
- python学习之路(22)
使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env python # - ...
- 关于tomcat的server.xml里host节点配置的一些说明
其实对这个一直搞不清楚,后来公司的网站遭遇与IIS进行整合,然后上面有几个应用需要进行配置,所以对tomcat的server.xml进行了一些深入的了解 Host的节点主要是起一个对域名解析到那个虚拟 ...
- 测试常用命令之awk篇
awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...
- Linux shell - shift命令用法(转载)
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- @清晰掉 spi协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...