\(\\\)

\(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相关推荐

  1. CodeForces - 616C The Labyrinth dfs+暴力

    预处理每一个 ' . ' 的块(通过上下左右相连的),用 mp 二维数组存编号,,通过这个编号 存这个块含有的 ' . ' 个数 最后输出 #include<iostream> #incl ...

  2. codeforces Labyrinth

    codeforces Labyrinth Time Limit: 2 Sec Memory Limit: 512 MB Description You are playing some compute ...

  3. Codeforces 676D Theseus and labyrinth 模拟+bfs

    D. Theseus and labyrinth time limit per test 3 seconds memory limit per test 256 megabytes input sta ...

  4. 【CodeForces - 616C】The Labyrinth(bfs,并查集,STLset)

    题干: 求每个*能够到达的格子数量,只有.可以走(四个方向扩展),结果mod 10,替换 * 后输出. Input The first line contains two integers n, m  ...

  5. 【CodeForces - 616C 】The Labyrinth点石成金(并查集,dfs)

    题干: 小O无意间发现了一张藏宝图,它跟随藏宝图的指引来到了一个宫殿,宫殿的地板被分成了n*m块格子,每个格子上放置了金子或者石头 藏宝图告诉小O,它可以选择一块石头变成金子,并且带走与变化后的金子联 ...

  6. Educational Codeforces Round 5(C. The Labyrinth)【DFS标记父节点】

    链接 分析 这题可以使用DFS来解决,如果说从星号开始模拟出发DFS,时间复杂度可能会很坏.例如 .*... .*.*. .*.*. ...*. 这"."蛇形走位的话,对于每个星都 ...

  7. Codeforces Round #354 (Div. 2) D. Theseus and labyrinth(bfs)

    题意:给出一个n*m的地图,英雄从(xt,yt)出发,要到达敌人所在地(xm,ym).地图每个格子有设定: ^>v<代表向箭头方向有门,其他方向没门: URDL代表某个方向没门,其他方向都 ...

  8. Codeforces Round #516 (Div. 2Div.1)

    Codeforces Round #516 (Div. 2&&Div.1) (Div.1) 题号 题目 知识点 A Make a triangle! 贪心题 B Equations o ...

  9. Gym 100134L - Labyrinth of the Minotaur

    题目来源:http://codeforces.com/gym/100134/attachments 题意:给一个迷宫,问是否存在一种方案,可以用一个正方形块,堵住从左上到右下的所有路径,输出坐标及正方 ...

最新文章

  1. 如何在windows下安装JDK
  2. ~~做过的好玩的题~~
  3. call()、apply()、bind()
  4. BETA、RC、ALPHA、Release、GA 等版本号的意义
  5. (案例六)三种scrapy模拟登陆策略
  6. Java后端--25--内存数据库Redis讲解
  7. 解决: Android.bp ninja: error: unknown target MODULES-IN-xxx报错
  8. 软件设计师-项目工期计算
  9. python爬虫百度图片_python爬取百度图库多张图片
  10. 如何查看Linux虚拟机ip地址
  11. 七万字详解paddle-openVINO【CPU】-从环境配置-模型部署全流程
  12. 安装光盘并重新启动计算机戴尔,戴尔电脑怎么设置光盘启动
  13. Cadence-Allegro(一)----安装
  14. word文档误删怎么恢复
  15. 社会经济学中的因果分析思想初探
  16. set_intersection的基本使用方式
  17. python类takes no arguments_Python中的学习类出现的object() takes no parameters问题
  18. 鬼谷八荒修改先天气运+逆天改命
  19. 输入密码三次,简单程序
  20. 呼和浩特哈斯计算机学院,内蒙古师范大学计算机科学技术硕士生导师——哈斯...

热门文章

  1. 拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载和const修饰的取地址操作符重载...
  2. 睿至大数据与北交大强强联手布局大数据
  3. C#DataTable2Json(附时间格式化)
  4. shell脚本执行冲突事件-sshwhile
  5. apiCloud实现加载更多效果,基本完美~
  6. ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
  7. Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
  8. Web Page Request Principle
  9. 虚拟化技术天书:九宫格图解虚拟化——此文多风险,阅读需谨慎
  10. 网工七大计策掌握网络管理中的实战技术(转)