codeforces #583 problem D(搜索好题)
题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(1,1)无法到达(n,m),行进路线位向下或向右。
数据范围:n*m<=1e6
解题思路:答案一定是小于等于2的,因为可以直接阻碍(1,2)或是(2,1)。首先是自己的错误思路,从(1,1)开始宽搜,若某一相同步数的格子只有一个,那么就可以只阻碍这一个格子从而使之无法抵达(n,m)。但是在比赛结束5min发现了问题:可能存在“能到达(n,m)的相同步数”的格子只有一个,但可能对应这一步数存在另一个无法到达(n,m)的格子扰乱答案。于是就有了题解中的解决方案:先从(n,m)开始深搜,仅标记出能到达(n,m)的网格,再进行我原本的错误思路就可以解决问题。
赛后看评论,有一个更简单的想法,直接两次深搜,其中一个深搜是下的优先级大于右,另一个深搜是右的优先级大于下。这样如果两个路径是不相交的,那么答案为2,两条路径有相交,答案为1。我对这一解法的理解是:前一深搜描绘了可能路线的坐下边界,后一深搜描绘了可能路线的右上边界,两边界不相交那么就有多种方案。
解题代码:
#include <stdio.h> int num[];
int step[];
int mmap[];
int _map[];
int que[][];
int n,m;
int suan(int x,int y)
{
if (x>n || y>m || x< || y<) return ;
return (x-)*m+y;
}
void fin(int x,int y)
{
mmap[suan(x,y)]=;
if( _map[suan(x-,y)] && !mmap[suan(x-,y)] ) fin(x-,y);
if( _map[suan(x,y-)] && !mmap[suan(x,y-)] ) fin(x,y-);
} int main()
{
scanf("%d%d",&n,&m);int mmstep=; for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
step[suan(i,j)]=;
char ch=getchar();
while (ch!='.' && ch!='#') ch=getchar();
if (ch=='.') _map[suan(i,j)]=;
else _map[suan(i,j)]=;
}
fin(n,m);
if (!mmap[suan(,)]){printf("0\n");return ;} int tt=,ll=;que[ll][]=;que[ll][]=;
while (ll<tt)
{
int x=que[ll][],y=que[ll][]; int nowtp=step[suan(x,y)];num[nowtp]++; if (nowtp>mmstep) mmstep=nowtp;
int tmp=suan(x+,y);
if (x<n && mmap[tmp] && (!step[tmp]))
{
que[tt][]=x+;
que[tt][]=y;
step[suan(x+,y)]=nowtp+;
//printf("%d %d\n",x+1,y);
tt++;
}
tmp=suan(x,y+);
if (y<m && mmap[tmp] && !step[tmp])
{
que[tt][]=x;
que[tt][]=y+;
step[suan(x,y+)]=nowtp+;
//printf("%d %d\n",x,y+1);
tt++;
}
ll++;
}
int ans=;
if (mmstep != n+m-)
ans=; for (int i=;i<mmstep;i++)
if (num[i]<ans)
ans=num[i];
printf("%d\n",ans); }
#include <stdio.h>
int n,m;
bool flag[];
bool tmp=,tmp2=;
int get(int x,int y)
{
if (x>n || y>m) return ;
return (x-)*m+y;
}
bool fin1(int x,int y)
{
flag[get(x,y)]=;
if (x==n &&y==m) {tmp=true;return ;}
if (!tmp && flag[get(x+,y)]) fin1(x+,y);
if (!tmp && flag[get(x,y+)]) fin1(x,y+);
}
bool fin2(int x,int y)
{
flag[get(x,y)]=;
if (x==n &&y==m) {tmp2=true;return ;}
if (!tmp2 && flag[get(x,y+)]) fin2(x,y+);
if (!tmp2 && flag[get(x+,y)]) fin2(x+,y);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
char ch=getchar();
while (ch!='.'&& ch!='#') ch=getchar();
if (ch=='.') flag[get(i,j)]=true;
else flag[get(i,j)]=false;
} fin1(,);
if (!tmp){
printf("0\n");return ;
}
flag[]=true;flag[get(n,m)]=true;
fin2(,);
if (tmp2){
printf("");
}
else
printf("");
}
codeforces #583 problem D(搜索好题)的更多相关文章
- Codeforces 1254C/1255F Point Ordering (交互题)
题目链接 http://codeforces.com/contest/1254/problem/C 题解 sb题. 第一次,通过\((n-2)\)次询问2确定\(p[2]\),也就是从\(1\)来看& ...
- HDU 5832 A water problem(某水题)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- Codeforces 828B Black Square(简单题)
Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n × m. ...
- 搜索 水题&&错误集锦
引子: 本以为搜索的题目老师也不会检查,结果今天早上loli慢悠悠的说:“请同学们提交一下搜索的题目~”,顿时心旌摇曳,却也只能装作镇定自若的样子,点了点头.. 然后就开始了今天的疯狂做题,虽说题目都 ...
- http://codeforces.com/gym/100623/attachments E题
http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次 ...
- Problem L: 搜索基础之马走日
Problem L: 搜索基础之马走日 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 134 Solved: 91[Submit][Status][W ...
- Problem K: 搜索基础之棋盘问题
Problem K: 搜索基础之棋盘问题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 92 Solved: 53[Submit][Status][W ...
- Problem J: 搜索基础之红与黑
Problem J: 搜索基础之红与黑 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 170 Solved: 100[Submit][Status][ ...
随机推荐
- git项目版本处理--远程分支重新拉取本地代码如何处理
最近在eclipse 上用git拉取分支,提交代码因为提交代码提交了一些配置文件造成 后续同事提交代码一直出现代码冲突问题 项目老大又重新拉取了一条代码 同样的分支名字 当时有点蒙不知道接着怎么弄:场 ...
- 转载 vue-awesome-swiper - 基于vue实现h5滑动翻页效果
说到h5的翻页,很定第一时间想到的是swiper.但是我当时想到的却是,vue里边怎么用swiper?! 中国有句古话叫:天塌下来有个高的顶着. 在前端圈里,总有前仆后继的仁人志士相继挥洒着热汗(这里 ...
- 【Laravel】 安装及常用的artisan命令
composer Laravel 安装 cmd composer create-project laravel/laravel Laravel5 之后自动创建 常用的artisan命令 全局篇 查看a ...
- MapReduce 运行全过程解析
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 前言 前面我们讲了 MapReduce 的编程模型,我们知道他主要分成两大阶段来完成一项任务,一是 m ...
- 对比度拉伸(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 对比度拉伸是扩展图像灰度级动态范围的处理.通过在灰度级中确定两个点来控制变换函数的形状.下面是对比度拉伸函数中阈值处理的代码示例,阈值为平均值. 2. 测试结果 图源自skimage ...
- Activiti6系列(2)- 运行和编译
前言 Activiti6.0在官网已经无法下载了,需要在Github上下载. 下载地址: https://github.com/Activiti/Activiti/releases/download/ ...
- java并发编程(一)----线程基础知识
在任何的生产环境中我们都不可逃避并发这个问题,多线程作为并发问题的技术支持让我们不得不去了解.这一块知识就像一个大蛋糕一样等着我们去分享,抱着学习的心态,记录下自己对并发的认识. 1.线程的状态: 线 ...
- 使用sublime调试node.js
安装node相关 从node官网下载node的安装文件,我下的版本是node-v0.10.22-x64.exe,安装完node,node相关工具应该都加都环境变量path中了. 命令行下安装node- ...
- 100天搞定机器学习|Day36用有趣的方式解释梯度下降算法
本文为3Blue1Brown神经网络课程讲解第二部分<Gradient descent, how neural networks learn >的学习笔记,观看地址:www.bilibil ...
- Python RPC 之 gRPC
gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang.Python.Java等),本篇只介绍 Py ...