[ CodeForces 1063 B ] Labyrinth
\(\\\)
\(Description\)
给出一个四联通的\(N\times M\) 网格图和起点。图中有一些位置是障碍物。
现在上下移动步数不限,向左至多走 \(a\) 步,向右至多走 \(b\) 步,求从起点出发能到达多少个空地。
- \(N,M\le 2000\)
\(\\\)
\(Solution\)
爷们太神了......
开始的想法是直接跑最短路, \(dist\) 为横向移动总步数。
后来发现矛盾在于,如果到一个格子向左走的步数较少,向右走的步数较多,和这种情况反过来,无法确定那种更优,进而无法确定用那种状态更新接下来的点。
然后听爷们讲了好久听懂了正确性证明。考虑要从起点 U 到达 V 这个格子,它横向的差值为 \(2\) 是固定的。
也就是说,任何一个合法的方案向左走的步数减掉向右走的步数都应该等于 \(2\)。
那么这种矛盾不存在了。因为向左向右的步数会同时增长,否则一定不会到达这个目标点。
然后就愉快上最短路,根据\(Dij\) 的原理,循环次数就是访问的点数。
\(\\\)
\(Code\)
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 2010
#define R register
#define gc getchar
#define inf 2000000000
using namespace std;
typedef long long ll;inline ll rd(){ll x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int n,m,lx,rx,ux,uy,ans;bool mp[N][N],vis[N][N];struct dist{int x,y,l,r,sum;friend operator < (const dist &x,const dist &y){return x.sum>y.sum;}
}dis[N][N];priority_queue<dist> q;int main(){n=rd(); m=rd();ux=rd(); uy=rd();lx=rd(); rx=rd();char c=gc();for(R int i=1;i<=n;++i)for(R int j=1;j<=m;++j){while(c!='.'&&c!='*') c=gc();mp[i][j]=(c=='.');c=gc();dis[i][j].x=i; dis[i][j].y=j;dis[i][j].l=dis[i][j].r=dis[i][j].sum=inf;}dis[ux][uy].l=dis[ux][uy].r=dis[ux][uy].sum=0;q.push(dis[ux][uy]);while(!q.empty()){dist x=q.top(); q.pop();if(vis[x.x][x.y]) continue;vis[x.x][x.y]=1; ++ans;if(mp[x.x+1][x.y]){if(dis[x.x+1][x.y].sum>x.sum){dis[x.x+1][x.y].l=x.l;dis[x.x+1][x.y].r=x.r;dis[x.x+1][x.y].sum=x.sum;q.push(dis[x.x+1][x.y]);}}if(mp[x.x-1][x.y]){if(dis[x.x-1][x.y].sum>x.sum){dis[x.x-1][x.y].l=x.l;dis[x.x-1][x.y].r=x.r;dis[x.x-1][x.y].sum=x.sum;q.push(dis[x.x-1][x.y]);}}if(mp[x.x][x.y-1]&&x.l<lx){if(dis[x.x][x.y-1].sum>x.sum+1){dis[x.x][x.y-1].l=x.l+1;dis[x.x][x.y-1].r=x.r;dis[x.x][x.y-1].sum=x.sum+1;q.push(dis[x.x][x.y-1]);}}if(mp[x.x][x.y+1]&&x.r<rx){if(dis[x.x][x.y+1].sum>x.sum+1){dis[x.x][x.y+1].l=x.l;dis[x.x][x.y+1].r=x.r+1;dis[x.x][x.y+1].sum=x.sum+1;q.push(dis[x.x][x.y+1]);}}}printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/SGCollin/p/9792791.html
[ CodeForces 1063 B ] Labyrinth相关推荐
- CodeForces - 616C The Labyrinth dfs+暴力
预处理每一个 ' . ' 的块(通过上下左右相连的),用 mp 二维数组存编号,,通过这个编号 存这个块含有的 ' . ' 个数 最后输出 #include<iostream> #incl ...
- codeforces Labyrinth
codeforces Labyrinth Time Limit: 2 Sec Memory Limit: 512 MB Description You are playing some compute ...
- Codeforces 676D Theseus and labyrinth 模拟+bfs
D. Theseus and labyrinth time limit per test 3 seconds memory limit per test 256 megabytes input sta ...
- 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)
题干: 求每个*能够到达的格子数量,只有.可以走(四个方向扩展),结果mod 10,替换 * 后输出. Input The first line contains two integers n, m ...
- 【CodeForces - 616C 】The Labyrinth点石成金(并查集,dfs)
题干: 小O无意间发现了一张藏宝图,它跟随藏宝图的指引来到了一个宫殿,宫殿的地板被分成了n*m块格子,每个格子上放置了金子或者石头 藏宝图告诉小O,它可以选择一块石头变成金子,并且带走与变化后的金子联 ...
- Educational Codeforces Round 5(C. The Labyrinth)【DFS标记父节点】
链接 分析 这题可以使用DFS来解决,如果说从星号开始模拟出发DFS,时间复杂度可能会很坏.例如 .*... .*.*. .*.*. ...*. 这"."蛇形走位的话,对于每个星都 ...
- Codeforces Round #354 (Div. 2) D. Theseus and labyrinth(bfs)
题意:给出一个n*m的地图,英雄从(xt,yt)出发,要到达敌人所在地(xm,ym).地图每个格子有设定: ^>v<代表向箭头方向有门,其他方向没门: URDL代表某个方向没门,其他方向都 ...
- Codeforces Round #516 (Div. 2Div.1)
Codeforces Round #516 (Div. 2&&Div.1) (Div.1) 题号 题目 知识点 A Make a triangle! 贪心题 B Equations o ...
- Gym 100134L - Labyrinth of the Minotaur
题目来源:http://codeforces.com/gym/100134/attachments 题意:给一个迷宫,问是否存在一种方案,可以用一个正方形块,堵住从左上到右下的所有路径,输出坐标及正方 ...
最新文章
- 如何在windows下安装JDK
- ~~做过的好玩的题~~
- call()、apply()、bind()
- BETA、RC、ALPHA、Release、GA 等版本号的意义
- (案例六)三种scrapy模拟登陆策略
- Java后端--25--内存数据库Redis讲解
- 解决: Android.bp ninja: error: unknown target MODULES-IN-xxx报错
- 软件设计师-项目工期计算
- python爬虫百度图片_python爬取百度图库多张图片
- 如何查看Linux虚拟机ip地址
- 七万字详解paddle-openVINO【CPU】-从环境配置-模型部署全流程
- 安装光盘并重新启动计算机戴尔,戴尔电脑怎么设置光盘启动
- Cadence-Allegro(一)----安装
- word文档误删怎么恢复
- 社会经济学中的因果分析思想初探
- set_intersection的基本使用方式
- python类takes no arguments_Python中的学习类出现的object() takes no parameters问题
- 鬼谷八荒修改先天气运+逆天改命
- 输入密码三次,简单程序
- 呼和浩特哈斯计算机学院,内蒙古师范大学计算机科学技术硕士生导师——哈斯...
热门文章
- 拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载...
- 睿至大数据与北交大强强联手布局大数据
- C#DataTable2Json(附时间格式化)
- shell脚本执行冲突事件-sshwhile
- apiCloud实现加载更多效果,基本完美~
- ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
- Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
- Web Page Request Principle
- 虚拟化技术天书:九宫格图解虚拟化——此文多风险,阅读需谨慎
- 网工七大计策掌握网络管理中的实战技术(转)