[Contest20171005]Maze
考虑一个$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的更多相关文章
- Backtracking algorithm: rat in maze
Sept. 10, 2015 Study again the back tracking algorithm using recursive solution, rat in maze, a clas ...
- (期望)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 ...
- 1204. Maze Traversal
1204. Maze Traversal A common problem in artificial intelligence is negotiation of a maze. A maze ...
- uva705--slash maze
/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ #include&q ...
- 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 ...
- Borg Maze(MST & bfs)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9220 Accepted: 3087 Descrip ...
- poj 3026 bfs+prim Borg Maze
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9718 Accepted: 3263 Description The B ...
- HDU 4035:Maze(概率DP)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze Special Judge Problem Description When w ...
- POJ 3026 : Borg Maze(BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
随机推荐
- bzoj 2669 状压DP
因为最多有8个'X',所以我们可以用w[i][s]来表示现在我们填了前i个数,填的X的为S,因为每次新加进来的数都不影响前面的最小值,所以我们可以随便添加,这样就有了剩下所有位置的方案,每次都这样转移 ...
- bzoj 1202 并查集
首先我们知道若干区间和信息,判断给出信息是否合法,可以用并查集维护,我们用dis[x]表示x到father[x]的距离为多少,即区间father[x]到x的长度,这样我们可以在路径压缩的时候维护dis ...
- 八大疯狂的HTML5 Canvas及WebGL动画效果——8 CRAZY ANIMATIONS WITH WEBGL AND HTML5 CANVAS【收藏】
HTML5, WebGL and Javascript have changed the way animation used to be. Past few years, we can only a ...
- js_微信分享,监听点击分享,分享成功,取消分享,分享失败回调
2017-06-13 见代码: function weixinShare() { var links = links = "www.youku.com"; common.get_o ...
- php中的__call()函数重载
<?php #调用类中没有的方法时, 会自动调用__call方法重载 #第一个参数是调用时的方法名, 第二个参数为参数组成的数组 class Cat{ public function Hello ...
- java===java基础学习(1)---数据类型,运算,变量,常量
今天起开始了java的学习之路,主要学习了数据类型和运算,变量,常量.基本和python有很多相通的地方,所以看起来很容易上手.下面是学习笔记! package testbotoo; public c ...
- U-Boot启动过程完全分析<转>
转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html 1.1 U-Boot工作过程 U-Boot启动内核的过程可 ...
- Jquery和JS实现浏览器全屏
var fullscreen=function(){ elem=document.body; if(elem.webkitRequestFullScreen){ elem.webkitRequestF ...
- Mysql 数据库学习笔记01查询
1.数据查询基本操作 * 正则表达式查询: 字段名 regexp '匹配方式', select * from user where username regexp '^名' -- 查询 姓名 名 ...
- django “如何”系列2:如何编写django-admin 命令
应用可以使用manage.py注册自己的动作,例如,你可能想要为你即将发布的应用添加一个manage.py 操作.这节我们将为polls应用添加一个closepoll的命令 添加一个managemen ...