BFS/DFS 模板 代码

来源:互联网 发布:淘宝退衣服包装袋损坏 编辑:程序博客网 时间:2024/04/28 20:02

转自:http://blog.csdn.net/liygcheng/article/details/12353555


[cpp] view plaincopyprint?
  1. <span style="font-size:18px">#include<cstdio>  
  2. #include<cstring>  
  3. #include<queue>  
  4. #include<algorithm>  
  5. using namespace std;  
  6. const int maxn=100;  
  7. bool vst[maxn][maxn]; // 访问标记  
  8. int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量  
  9.   
  10. struct State // BFS 队列中的状态数据结构  
  11. {  
  12.     int x,y; // 坐标位置  
  13.     int Step_Counter; // 搜索步数统计器  
  14. };  
  15.   
  16. State a[maxn];  
  17.   
  18. boolCheckState(State s) // 约束条件检验  
  19. {  
  20.     if(!vst[s.x][s.y] && ...) // 满足条件         
  21.         return 1;  
  22.     else // 约束条件冲突  
  23.     return 0;  
  24. }  
  25.   
  26. void bfs(State st)  
  27. {  
  28.     queue <State> q; // BFS 队列  
  29.     State now,next; // 定义2 个状态,当前和下一个  
  30.     st.Step_Counter=0; // 计数器清零  
  31.     q.push(st); // 入队     
  32.     vst[st.x][st.y]=1; // 访问标记  
  33.     while(!q.empty())  
  34.     {  
  35.         now=q.front(); // 取队首元素进行扩展  
  36.         if(now==G) // 出现目标态,此时为Step_Counter 的最小值,可以退出即可  
  37.         {  
  38.             ...... // 做相关处理  
  39.             return;  
  40.         }  
  41.     for(int i=0;i<4;i++)  
  42.     {  
  43.         next.x=now.x+dir[i][0]; // 按照规则生成   下一个状态  
  44.         next.y=now.y+dir[i][1];  
  45.         next.Step_Counter=now.Step_Counter+1; // 计数器加1  
  46.         if(CheckState(next)) // 如果状态满足约束条件则入队  
  47.         {  
  48.             q.push(next);  
  49.             vst[next.x][next.y]=1; //访问标记  
  50.         }  
  51.     }  
  52.     q.pop(); // 队首元素出队  
  53.     }  
  54.  return;  
  55. }  
  56.   
  57. int main()  
  58. {  
  59. ......  
  60.  return 0;  
  61. }  
  62. </span><pre name="code" class="cpp">DFS:  
  63. /* 
  64. 该DFS 框架以2D 坐标范围为例,来体现DFS 算法的实现思想。 
  65. */  
  66. #include<cstdio>  
  67. #include<cstring>  
  68. #include<cstdlib>  
  69. using namespace std;  
  70. const int maxn=100;  
  71. bool vst[maxn][maxn]; // 访问标记  
  72. int map[maxn][maxn]; // 坐标范围  
  73. int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量,(x,y)周围的四个方向  
  74.   
  75. bool CheckEdge(int x,int y) // 边界条件和约束条件的判断  
  76. {  
  77.     if(!vst[x][y] && ...) // 满足条件  
  78.         return 1;  
  79.     else // 与约束条件冲突  
  80.         return 0;  
  81. }  
  82.   
  83. void dfs(int x,int y)  
  84. {  
  85.     vst[x][y]=1; // 标记该节点被访问过  
  86.     if(map[x][y]==G) // 出现目标态G  
  87.         {  
  88.         ...... // 做相应处理  
  89.         return;  
  90.         }  
  91.     for(int i=0;i<4;i++)  
  92.     {  
  93.         if(CheckEdge(x+dir[i][0],y+dir[i][1])) // 按照规则生成下一个节点  
  94.             dfs(x+dir[i][0],y+dir[i][1]);  
  95.     }  
  96.     return// 没有下层搜索节点,回溯  
  97. }  
  98. int main()  
  99. {  
  100. ......  
  101. return 0;  
  102. }  
  103. </pre><br><br>  

0 0
原创粉丝点击