题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(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(搜索好题)的更多相关文章

  1. Codeforces 1254C/1255F Point Ordering (交互题)

    题目链接 http://codeforces.com/contest/1254/problem/C 题解 sb题. 第一次,通过\((n-2)\)次询问2确定\(p[2]\),也就是从\(1\)来看& ...

  2. HDU 5832 A water problem(某水题)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  4. Codeforces 828B Black Square(简单题)

    Codeforces 828B Black Square(简单题) Description Polycarp has a checkered sheet of paper of size n × m. ...

  5. 搜索 水题&&错误集锦

    引子: 本以为搜索的题目老师也不会检查,结果今天早上loli慢悠悠的说:“请同学们提交一下搜索的题目~”,顿时心旌摇曳,却也只能装作镇定自若的样子,点了点头.. 然后就开始了今天的疯狂做题,虽说题目都 ...

  6. http://codeforces.com/gym/100623/attachments E题

    http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次 ...

  7. Problem L: 搜索基础之马走日

    Problem L: 搜索基础之马走日 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 134  Solved: 91[Submit][Status][W ...

  8. Problem K: 搜索基础之棋盘问题

    Problem K: 搜索基础之棋盘问题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 92  Solved: 53[Submit][Status][W ...

  9. Problem J: 搜索基础之红与黑

    Problem J: 搜索基础之红与黑 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 170  Solved: 100[Submit][Status][ ...

随机推荐

  1. c#小灶——使用visual studio编写第一个程序

    虽然,写程序有文本编辑器和编译器就已经足够,但是,我们为了增加工作效率还是要使用IDE. 我们接下来所有的教程都将会在visual studio中实现,visual studio简称vs,是微软开发的 ...

  2. 集合(Collection解析 Set List Map三大集合运用)

    集合的概念:          集合是包含多个对象的简单对象,所包含的对象称为元素.集合里面可以包含任意多个对象,数量可以变化:同时对对象的类型也没有限制,也就是说集合里面的所有对象的类型可以相同,也 ...

  3. React 如何搭建脚手架

    React 如何搭建脚手架   npm install -g create-react-app    //安装 create-react-app react-demo    // react-demo ...

  4. 微信小程序云开发报错解决: Setting data field "openid" to undefined is invalid.

    最近在学习微信小程序云开发,刚一开始就遇到了问题. 点击获取openid的时候控制台开始报错: [云函数] [login] user openid:  undefined VM97:1 Setting ...

  5. Mybatis学习笔记之---动态sql中标签的使用

    动态Sql语句中标签的使用 (一)常用标签 1.<if> if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段 ...

  6. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

    标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11260750. ...

  7. Flutter 1.7 正式版发布

    今天,我们非常高兴地向大家宣布又一个正式版本的发布 -- Flutter 1.7,这是继上次 I/O 时众多重要功能发布以来的一次小更新.Flutter 1.7 包含了对 AndroidX 的支持,满 ...

  8. Dubbo的基本介绍及使用

    一,前言 ​ 在面对新技术新事物的时候,我们首先应该了解这是一个什么东东,了解为什么使用这门技术,如果我们不使用又会有什么影响.比如,本篇博客介绍Dubbo的基本使用,此时我们应该先要明白我为什么要使 ...

  9. Jedis的配置和优化

    参数名:maxTotal 含义:资源池最大连接数 [默认值:8] 使用建议:需要考虑以下几点 1.业务希望的Redis并发量 2.客户端执行命令时间 3.Redis资源:例如应用个数(客户端)* ma ...

  10. 5.MySQL数据库操作步骤

    第一步:登录到MySQL服务器 第二步:选择当前要操作的数据库 第三步:设置请求和返回数据的字符集 第四步:执行SQL语句 l 增加记录:INSERT INTO news(title,content) ...