题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(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. Linux 常用命令及使用方法

    1.  type   :查询命令 是否属于shell解释器 2.  help  : 帮助命令3.  man : 为所有用户提供在线帮助4.  ls  : 列表显示目录内的文件及目录 -l    以长格 ...

  2. 什么是redis的缓存雪崩与缓存穿透

    今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓 ...

  3. 二、Markdown基本语法

    目录 2.1 标题 一级标题 二级标题 三级标题 2.2 加粗 2.3倾斜 2.4 高亮 2.5 上标 2.6 下标 2.7 代码引用(>式) 2.8 代码引用(```式) 2.9 代码引入(` ...

  4. html的一些基本语法学习与实战

    其实在学校前端开始之前,问过自己为什么要学,因为自己学的比较杂,直到现在刚刚毕业出来工作了,才明确了方向了,要往嵌入式方向走,但是随着时代的发展,在编程和智能硬件结合的越来越紧密,特别是物联网这一块, ...

  5. 第四章 文件的基本管理和XFS文件系统备份恢复 随堂笔记

    第四章 文件的基本管理和XFS文件系统备份恢复 本节所讲内容: 4.1 Linux系统目录结构和相对/绝对路径. 4.2 创建/复制/删除文件,rm -rf / 意外事故 4.3 查看文件内容的命令 ...

  6. 在vue项目中引入阿里图标库小记

    使用Vue技术栈开发不仅效率高,而且很友好,而且还有很多基于vue的UI框架,例如:element等,但是这类框架美中不足的是,图标太少.为了解决这个问题,不得不引入第三方字体库,今天以阿里图标库为例 ...

  7. mac下使用zerobrane调试cocos2dx的lua

    环境:MacOSx 10.9.2, Lua 5.1.4, luaSocket 2.0.2, xcode5.0.2 所需文件 luasocket-2.0.2.zip,ZeroBraneStudioEdu ...

  8. 使用sublime调试node.js

    安装node相关 从node官网下载node的安装文件,我下的版本是node-v0.10.22-x64.exe,安装完node,node相关工具应该都加都环境变量path中了. 命令行下安装node- ...

  9. Git使用(码云)

    1.安装git软件(码云/GitHub) 2.码云注册,保存代码 3.创建代码托管仓库,仓库名相当于码云上的文件夹 4.写作业并提交 在作业文件夹上,右键选择‘get bash here’ 在黑框里输 ...

  10. Java实现ZooKeeper的zNode监控

    上一篇文章已经完成了ZooKeeper的基本搭建和使用的介绍,现在开始用代码说话.参考 https://zookeeper.apache.org/doc/current/javaExample.htm ...