题目大意:在一个已经有障碍的地图上,设置尽可能少的障碍使得(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. 动态开内存(malloc与calloc)

    malloc与calloc 1.函数原型 #include<stdlib.h> void *malloc(unsigned int size);     //申请size字节的内存 voi ...

  2. 有趣的Flex布局

    对于刚接触前端的小白,在还原页面样式的时候,往往会遇到页面布局(layout)上的问题,用着生硬的padding来固定盒子的位置,不仅代码看的沉重,还得适应各种浏览器页面,始终没有办法做到统一.接下来 ...

  3. Selenium+java - 借助autolt完成上传文件操作

    写在前面: 上传文件是每个自动化测试同学会遇到,而且可以说是面试必考的问题,标准控件我们一般用sendkeys()就能完成上传,但是我们的测试网站的上传控件一般为自己封装的,用传统的上传已经不好用了, ...

  4. 【Java例题】3.6 计算arcsin(x)的值

    6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...

  5. java学习中碰到的疑惑和解答(一)

    今天写一个接口的时候发现,接口的方法不需要写修饰符,直接写数据类型加上方法名(参数)即可通过编译. import java.util.List; import com.bjm.pojo.Flower; ...

  6. template.demo.js

    <!DOCTYPE html><html><head> <title>index</title> <meta charset=&quo ...

  7. 搭建Springboot网站有感

    最近心血来潮,搭建了个人网站,一方面想学习下新的知识,另一方面也想有个作品,在这分享下自己的体会,先不说知识点. 建站容易吗,因人而异,而我在完成这个最最简单的工作时起码经历了3个阶段不同的心理变化, ...

  8. Sublime Text 3 使用手册

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  9. NVIDIA: Failed to initialize NVML: driver/library version mismatch

    [NVIDIA驱动:Failed to initialize NVML: driver/library version mismatch] 原因:Ubuntu16.04 装新驱动时,会报以上错误,定位 ...

  10. ceph存储基础概念

    一.分布式文件系统: 是指文件系统管理的物理存储资源不一定直接是连接在本地节点上,而是通过计算机网络与节点相连. 分布式文件系统的设计基与C/S架构(客户端/服务器) 常见的分布式文件系统:Ceph. ...