博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1072
阅读量:5046 次
发布时间:2019-06-12

本文共 2020 字,大约阅读时间需要 6 分钟。

 
  1. #include <set>
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <string.h>
  8. #include <queue>
  9. using namespace std;
  10. #define MAX 300
  11. int map[MAX][MAX];
  12. bool visit[MAX][MAX]; // 访问标记
  13. int dir[4][2] = {
    0, 1, 0, -1, 1, 0, -1, 0}; // 方向向量 右,左,下,上
  14. int num;
  15. struct data // BFS队列中的状态数据结构
  16. {
  17. int x, y; // 坐标位置
  18. int step; // 搜索步数统计器
  19. int state;
  20. }start, over;
  21. void input_bfs(int row, int column)
  22. {
  23. int flag =0;
  24. int state;
  25. for(int i=1; i<=row; i++)
  26. for(int j=1; j<=column; j++)
  27. {
  28. scanf("%d", &state);
  29. if(state == 2)
  30. {
    start.x = i; start.y = j; start.state = 2;}
  31. else if(state == 3)
  32. {
    over.x = i; over.y =j; over.state = 3;}
  33. map[i][j] = state;
  34. }
  35. }
  36. void initialize(int row, int column)
  37. {
  38. memset(map, 0, sizeof(map) );
  39. memset(visit, false, sizeof(visit) );
  40. for(int i=1; i<=row; i++)
  41. for(int j=1; j<=column; j++)
  42. visit[i][j] = true;
  43. num = 0;
  44. }
  45. bool check_bfs(data temp)
  46. {
  47. if(visit[temp.x][temp.y] && map[temp.x][temp.y] ) // 满足条件,根据条件添加
  48. return 1;
  49. else return 0;
  50. }
  51. void bfs(data first)
  52. {
  53. queue<data> que; // BFS队列
  54. data now, next; // 定义2个状态,当前和下一个
  55. first.step = 0; // 计数器清零
  56. int begin = 0;
  57. que.push(first);
  58. visit[first.x][first.y] = 0;
  59. while(!que.empty() )
  60. {
  61. now = que.front(); // 取队首元素进行扩展
  62. if(now.step !=begin) {
    begin = now.step; num++;}
  63. if(now.x == over.x && now.y == over.y) // 出现目标态,此时为Step的最小值,可以退出即可
  64. {
  65. over.step = now.step; // 做相关处理
  66. return ;
  67. }
  68. if(map[now.x][now.y] == 4 && now.step < 6)
  69. now.step = 0;
  70. for(int i=0; i<4; i++)
  71. {
  72. next.x = now.x + dir[i][0];
  73. next.y = now.y + dir[i][1];
  74. next.step = now.step +1;
  75. if(check_bfs(next) ) // 如果状态满足约束条件则入队
  76. {
  77. que.push(next);
  78. visit[next.x][next.y] = 0;
  79. }
  80. }
  81. que.pop(); // 队首元素出队
  82. }
  83. return ;
  84. }
  85. int main()
  86. {
  87. freopen("read.txt", "r", stdin);
  88. int T;
  89. scanf("%d", &T);
  90. while(T--)
  91. {
  92. int row, column;
  93. scanf("%d%d", &row, &column);
  94. initialize(row, column);
  95. input_bfs(row, column);
  96. bfs(start);
  97. if(over.step < 6)
  98. printf("%d\n", num);
  99. else printf("-1\n");
  100. }
  101. return 0;
  102. }
    

附件列表

 

转载于:https://www.cnblogs.com/sober-reflection/p/264732a7cd90031f437bf1f1148103b1.html

你可能感兴趣的文章
浏览器跨域问题
查看>>
HTML5 input控件 placeholder属性
查看>>
使用JAVA如何对图片进行格式检查以及安全检查处理
查看>>
html5实现移动端下拉刷新(原理和代码)
查看>>
iPhone开发中从一个视图跳到另一个视图有三种方法:
查看>>
pytho logging
查看>>
一个Java程序员应该掌握的10项技能
查看>>
c#英文大小写快捷键
查看>>
tpframe免费开源框架又一重大更新
查看>>
一.go语言 struct json相互转换
查看>>
什么是架构设计
查看>>
程序员学习能力提升三要素
查看>>
PHP 微信错误状态返回码说明
查看>>
【4.1】Python中的序列分类
查看>>
ubuntu 移动文件
查看>>
Easy Mock
查看>>
看看 Delphi XE2 为 VCL 提供的 14 种样式
查看>>
Python内置函数(29)——help
查看>>
机器学习系列-tensorflow-01-急切执行API
查看>>
SqlServer 遍历修改字段长度
查看>>