经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
cf1064D. Labyrinth(01BFS)
来源:cnblogs  作者:自为风月马前卒  时间:2018/10/16 9:36:17  对本文有异议

题意

题目链接

给出一个\(n \times m\)的网格,给出起始点,要求向左走不超过\(L\)步,向右走不超过\(R\)步,求出能遍历到哪些点

Sol

一个很直观的想法,BFS的时候状态里记录下还能向左 / 右走多少步,然后xjbBFS,恭喜你fst了。。

正解非常的巧妙:

可以这样想:如果我们保证了到达一个点时向左走的次数最少,那么是不是也可以保证向右走的次数最少呢?

答案是肯定的,因为向右走了一次之后肯定需要向左走一次来抵消掉这次操作

向右同理

把向左/右的边权看成1,向上/下的边权看成0,一波SPFA01BFS

  1. #include<bits/stdc++.h>
  2. const int MAXN = 2001;
  3. int N, M, r, c, X, Y, vis[MAXN][MAXN], ans, xx[4] = {-1, +1, 0, 0}, yy[4] = {0, 0, -1, +1};
  4. char s[MAXN][MAXN];
  5. struct Node {
  6. int x, y, l, r;
  7. };
  8. main() {
  9. std::cin >> N >> M >> r >> c >> X >> Y;
  10. for(int i = 1; i <= N; i++) scanf("%s", s[i] + 1);
  11. std::deque<Node> q; q.push_back((Node) {r, c, X, Y});
  12. while(!q.empty()) {
  13. Node p; p = q.front(); q.pop_front();
  14. if(vis[p.x][p.y] || (p.l < 0) || (p.r < 0)) continue;
  15. vis[p.x][p.y] = 1; ans++;
  16. for(int i = 0; i < 4; i++) {
  17. int wx = p.x + xx[i], wy = p.y + yy[i];
  18. if(wx < 1 || wx > N || wy < 1 || wy > M || (s[wx][wy] == '*') || (vis[wx][wy])) continue;
  19. if(i == 0 || i == 1) {q.push_front((Node) {wx, wy, p.l, p.r}); continue;}
  20. if(i == 2) {q.push_back((Node) {wx, wy, p.l - 1, p.r}); continue;}
  21. if(i == 3) q.push_back((Node) {wx, wy, p.l, p.r - 1});
  22. }
  23. }
  24. printf("%d", ans);
  25. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号