去年因为太low没有做出来校赛的最后一题,遂今年校赛做了这个题,下面我做详细描述。

原题链接

  本题大意:给定一个无向图G,每个边的权值为1,图中L表示起点,C表示终点,#表示未通路,给定时间k,让你判断是否能在给定时间k内走到C,并回答路径最短的路径有多少条?

  本题思路:裸的搜索问题,由于图过大,所以直接dfs搜会超时,需要先bfs求解答案如果k步内能走到则再进行下一步的求解。。。

参考代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <string>
  5. #include <queue>
  6. #include <stack>
  7. #include <set>
  8. #include <map>
  9. #include <cmath>
  10. #include <algorithm>
  11. #define mid ((l + r) / 2)
  12. using namespace std;
  13.  
  14. typedef pair<int, int> pii;
  15. typedef long long ll;
  16. typedef unsigned long long ull;
  17. const double pi = acos(-1.0);
  18.  
  19. const int maxn = 1e3 + ;
  20. int n, m, k, step, ans, Dist;
  21. char G[maxn][maxn];
  22. int dist[maxn][maxn];
  23. bool vis[maxn][maxn];
  24. pii B, E, now, Next;
  25.  
  26. int bfs(int x, int y) {
  27. memset(vis, false, sizeof vis);
  28. memset(dist, , sizeof dist);
  29. queue <pii> Q;
  30. Q.push(make_pair(x, y));
  31. dist[x][y] = ;
  32. while(!Q.empty()) {
  33. pii now = Q.front();
  34. Q.pop();
  35. if(now.first == E.first && now.second == E.second) return dist[now.first][now.second];
  36. for(int dx = -; dx <= ; dx ++) {
  37. for(int dy = -; dy <= ; dy ++) {
  38. if(abs(dx - dy) == ) {
  39. Next.first = now.first + dx;
  40. Next.second = now.second + dy;
  41. if(!vis[Next.first][Next.second] && Next.first >= && Next.first < n && Next.second >= && Next.second < m && G[Next.first][Next.second] != '#') {
  42. dist[Next.first][Next.second] = dist[now.first][now.second] + ;
  43. Q.push(make_pair(Next.first, Next.second));
  44. vis[Next.first][Next.second] = true;
  45. }
  46. }
  47. }
  48. }
  49. }
  50. return -;
  51. }
  52.  
  53. void dfs(pii B, pii E, int D) {
  54. if(B.first == E.first && B.second == E.second) {
  55. if(D < Dist) {
  56. step = ;
  57. Dist = D;
  58. } else if(D == Dist) step ++;
  59. return;
  60. }
  61. if(D > Dist) return;
  62. for(int i = -; i <= ; i ++) {
  63. for(int j = -; j <= ; j ++) {
  64. if(abs(i - j) == ) {
  65. if(B.first + i >= && B.first + i < n && B.second + j >= && B.second + j < m) {
  66. if(G[B.first + i][B.second + j] != '#' && !vis[B.first + i][B.second + j]) {
  67. vis[B.first + i][B.second + j] = true;
  68. dfs(make_pair(B.first + i, B.second + j), E, D + );
  69. vis[B.first + i][B.second + j] = false;
  70. }
  71. }
  72. }
  73. }
  74. }
  75. }
  76.  
  77. int main() {
  78. ios_base :: sync_with_stdio(false);
  79. int t, Case = ;
  80. cin >> t;
  81. while(t --) {
  82. step = ;
  83. Dist = 0x3f3f3f3f;
  84. cin >> n >> m >> k;
  85. for(int i = ; i < n; i ++) cin >> G[i];
  86. for(int i = ; i < n; i ++) {
  87. for(int j = ; j < m; j ++) {
  88. if(G[i][j] == 'L') B = make_pair(i, j);
  89. if(G[i][j] == 'C') E = make_pair(i, j);
  90. }
  91. }
  92. ans = bfs(B.first, B.second);
  93. if(ans > k) ans = -;
  94. cout << "Case #" << ++ Case << ": " << ans << ' ';
  95. if(ans != -) {
  96. memset(vis, false, sizeof vis);
  97. dfs(B, E, );
  98. cout << step;
  99. }
  100. cout << endl;
  101. }
  102. return ;
  103. }

  相同的题目,如果边的权值不为1,则可用SPFA+dfs求解。

SUSTOJ_路痴的单身小涵(图中最短路的条数)的更多相关文章

  1. dijskra算法(求正权图中最短路)

    思想:每次找到离原点最近的顶点,以这个点为中心扩展松弛,更新其余点到原点的最短路径. 注意:if(e[u][v]>x)e[u][v]=x; book[ ]数组标记最短路程的顶点集合 #inclu ...

  2. poj 2135 Farm Tour 最小费用最大流建图跑最短路

    题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...

  3. [hdu2460]network(依次连边并询问图中割边数量) tarjan边双联通分量+lca

    题意: 给定一个n个点m条边的无向图,q个操作,每个操作给(x,y)连边并询问此时图中的割边有多少条.(连上的边会一直存在) n<=1e5,m<=2*10^5,q<=1e3,多组数据 ...

  4. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  5. opencv删除二值图中较小的噪点色块

    CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg. ...

  6. 有趣 GIF 动图集 - 仿佛每张小动图都诉说了一个小笑话或者小故事

    点这里 来自法国南特(Nantes)的 Guillaume Kurkdjian 目前还是个学生.Kurkdjian 擅长创作一些平面动态图像,这些有趣的小动图仿佛每张都诉说了一个小笑话或者小故事,像个 ...

  7. WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移

    原文:WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移 代码:: <UserControl x:Class="SQ.TestPage" xmlns=" ...

  8. 图中最短路径算法(Dijkstra算法)(转)

    1.Dijkstra 1)      适用条件&范围: a)   单源最短路径(从源点s到其它所有顶点v); b)   有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...

  9. 最简单实用的JQuery实现banner图中的text打字动画效果!!!

    下面,就让小博详细介绍如何实现上面GIF实现的banner图中的文字动画效果,最简单实用的方法(鉴于代码量较小,就内嵌在一个HTML文件中了): 首先,我们要在header导入一个jQuery,并新建 ...

随机推荐

  1. java调用shell脚本小demo

    复制指定文件cpp.sh: [root@localhost soft]# vim cpp.sh#!/bin/bash name="$1"\cp /home/soft/test/${ ...

  2. java 中的编码(二)

    UTF-16编码规则: 按照UTF-16编码规则计算下Unicode码位为 U+10002 (十进制:65538)的字符的UTF-16编码表示. U+10002落在 [U+10000, U+10FFF ...

  3. 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息

    三种控制DIV内容滚动的方法: 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv ...

  4. hive group by distinct区别以及性能比较

    Hive去重统计 相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order ...

  5. mybatis config 快速生成xml DAO

    0.加jar包 1.a.BAT java -jar E:\GZH\Mybaits\mybatis-generator-core-1.3.2\lib\mybatis-generator-core-1.3 ...

  6. docker 内时区和宿主机差8个小时,怎么办?

    docker run -d -it --name tt -e TZ=Asia/Shanghai -p : api 使用-e参数指定时区

  7. POJ 2456 Aggressive cows ( 二分 && 贪心 )

    题意 : 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1e9) ...

  8. 设计模式学习笔记——Adapter 适配器模式

    适配器设计模式的适应场景: 一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗, ...

  9. UOJ418. 【集训队作业2018】三角形

    http://uoj.ac/problem/418 题解 考虑激活每个节点时,它的每个儿子都是放满的. 那每一次的操作我们可以用一个二元组来表示\((w_i-\sum w_{son},\sum w_{ ...

  10. android开源框架thinkinandroid相关研究

    和命令相关的类有: TAICommand:接口文件,一个命令接口所有命令需要从此实现,还有以下几种方法: TACommandExecutor 命令的实现类,其中含有commands这个成员变量.大部分 ...