考虑一个$N\times M$的网格,每个网格要么是空的,要么是障碍物。整个网格四周都是墙壁(即第$1$行和第$N$行,第$1$列和第$M$列都是墙壁),墙壁有且仅有两处开口,分别代表起点和终点。起点总是在网格左边,终点总是在网格右边。你只能朝$4$个方向移动:上下左右。数据保证从起点到终点至少有一条路径。
从起点到终点可能有很多条路径,请找出有多少个网格是所有路径的必经网格。

——妙啊!

转换一下:

一个网格是必经网格

$\Rightarrow$它变成障碍物之后不能从起点走到终点

$\Rightarrow$它变成障碍物后,从$(1,1)$按八连通走'#'可以走到$(N,M)$

所以我们首先做两次bfs,分别记录那些与$(1,1)$或$(N,M)$按八连通可以互达的'#'

然后直接扫一遍,看哪些'.'被可以到达$(1,1)$和$(N,M)$的'#'夹着

然后......就做完了2333

#include<stdio.h>
#include<string.h>
char s[1010][1010];
bool r[1010][1010][2];
int n,m,qx[1000000],qy[1000000];
const int go[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
bool can(int p,int x,int y){
	return 1<=x&&x<=n&&1<=y&&y<=m&&s[x][y]=='#'&&!r[x][y][p];
}
void bfs(int p,int x,int y){
	int head,tail,i;
	head=tail=1;
	qx[1]=x;
	qy[1]=y;
	r[x][y][p]=1;
	while(head<=tail){
		x=qx[head];
		y=qy[head];
		head++;
		for(i=0;i<8;i++){
			if(can(p,x+go[i][0],y+go[i][1])){
				tail++;
				r[x+go[i][0]][y+go[i][1]][p]=1;
				qx[tail]=x+go[i][0];
				qy[tail]=y+go[i][1];
			}
		}
	}
}
int main(){
	int i,j,ii,jj,ans;
	bool flag;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%s",s[i]+1);
	bfs(0,1,1);
	bfs(1,n,m);
	ans=2;
	for(i=2;i<n;i++){
		for(j=2;j<m;j++){
			flag=0;
			for(ii=0;ii<7;ii++){
				for(jj=ii+1;jj<8;jj++){
					if((r[i+go[ii][0]][j+go[ii][1]][0]&&r[i+go[jj][0]][j+go[jj][1]][1])
					 ||(r[i+go[ii][0]][j+go[ii][1]][1]&&r[i+go[jj][0]][j+go[jj][1]][0])){
						ans++;
						flag=1;
						break;
					}
				}
				if(flag)break;
			}
		}
	}
	printf("%d",ans);
}

[Contest20171005]Maze的更多相关文章

  1. Backtracking algorithm: rat in maze

    Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...

  2. (期望)A Dangerous Maze(Light OJ 1027)

    http://www.lightoj.com/volume_showproblem.php?problem=1027 You are in a maze; seeing n doors in fron ...

  3. 1204. Maze Traversal

    1204.   Maze Traversal A common problem in artificial intelligence is negotiation of a maze. A maze ...

  4. uva705--slash maze

    /*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ #include&q ...

  5. HDU 4048 Zhuge Liang's Stone Sentinel Maze

    Zhuge Liang's Stone Sentinel Maze Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/327 ...

  6. Borg Maze(MST & bfs)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9220   Accepted: 3087 Descrip ...

  7. poj 3026 bfs+prim Borg Maze

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9718   Accepted: 3263 Description The B ...

  8. HDU 4035:Maze(概率DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze Special Judge Problem Description   When w ...

  9. POJ 3026 : Borg Maze(BFS + Prim)

    http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

随机推荐

  1. charles https抓包

    1. 配置 Charles 根证书 首先打开 Charles: Charles 启动界面 主界面 然后如下图操作:   之后会弹出钥匙串,如果不弹出,请自行打开钥匙串,如下图: 钥匙串 系统默认是不信 ...

  2. mysql 设置字符集

    可以用:show create table table_name查看建表信息 也可用: show create database database_name查看建库信息 mysql> creat ...

  3. Git常规配置与基本用法

    Git环境配置 一. 全局配置 1. 配置文件 git全局配置文件.gitconfig默认在当前系统用户文件夹下,window可运行%USERPROFILE%查找,Mac系统在cd ~查找. 具体配置 ...

  4. 【转】cve-2013-2094 perf_event_open 漏洞分析

    cve-2013-2094是于2013年4月前后发现的linux kernel本地漏洞,该漏洞影响3.8.9之前开启了PERF_EVENT的linux系统.利用该漏洞,通过perf_event_ope ...

  5. 1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色

    1002: 当不成勇者的Water只好去下棋了 Time Limit: 1 Sec  Memory Limit: 128 MB Description 由于魔王BOSS躲起来了,说好要当勇者的Wate ...

  6. C基础 多用户分级日志库 sclog

    引言 - sclog 总的设计思路 sclog在之前已经内置到simplec 简易c开发框架中一个日志库. 最近对其重新设计了一下. 减少了对外暴露的接口. 也是C开发中一个轮子. 比较简单, 非常适 ...

  7. Mui自定义时间格式:

    Mui自定义时间格式: (function($) { $.init(); $(document).on('tap','.btn',function(){ var obj = getFormJson($ ...

  8. XML、java解释XML、XML约束

    1.XML有什么用? (1)可以用来保存数据 (2)可以用来做配置文件 (3)数据传输载体 2.XML格式 XML 元素必须遵循以下命名规则: 名称可以含字母.数字以及其他的字符 名称不能以数字或者标 ...

  9. mysql 服务器配置

    Windows: 1.在bin目录下执行mysqld.exe --install-manual安装服务(删除命令是mysqld.exe --remove) 2.执行net start mysql启动服 ...

  10. JVM字节码执行引擎和动态绑定原理

    1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果. 在整个过程不同的数据在不同的结构中进行处理. 2.栈帧 jvm进行方法调用和方法执 ...