[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 ...
随机推荐
- 联系博主 Contact
李莫 / Ray OI 蒟蒻一只 / A Player of Olympiad in Informatics QQ:740929894 邮箱 / Email :rayking2017@outlook. ...
- charles & Fiddle
一.Charles Charles是在Mac下常用的截取网络封包的工具,在做移动端开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问 ...
- js中的for in 循环
1.数组 使用for in 遍历数组时,其索引被视为对象的属性,从而直接输出数组的索引 var arr = ["a","b","c"]; f ...
- Part2-HttpClient官方教程-Chapter3-HTTP状态管理
ps:近日忙于课设与一个赛事的准备....时间真紧啊~~ 最初,HTTP被设计为一种无状态的,面向请求/响应的协议,它并没有为跨越多个逻辑相关的请求/响应交换的有状态会话做出特殊规定.随着HTTP协议 ...
- Spark实现销量统计
package com.mengyao.examples.spark.core; import java.io.Serializable; import org.apache.hadoop.io.Nu ...
- C++学习之路(二):引用
(1)引用是变量的别名 引用的基本定义格式:类型 &引用名 = 变量名 例如:int a = 1; int &b = a,这里b是a的别名,b与a都指向了同一块内存单元. 对于引用而言 ...
- C++学习之路(一):const与define,结构体对齐,new/delete
前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验. (一)const与define 关于con ...
- 微信支付:curl 出错,错误码: 60
在测试微信支付 - 模式二 - 扫码支付时,遇到如下错误: curl出错,错误码:60 这是因为在 WxPay.Api.php 文件中做了严格的 ssl 证书校验: curl_setopt($ch,C ...
- MVC使用Newtonsoft无需实体类,实现JSON数据返回给前端页面使用
//引用using Newtonsoft.Json; using Newtonsoft.Json.Linq; public ActionResult JsonSample() { ResponseRe ...
- jequry_rotate.js用来写旋转类的东西的插件(如:抽奖转盘)
网上发现一个很有意思的jQuery旋转插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .Opera 9 .Google Chrome,高级浏览器下 ...