BFS迷宫问题
Posted wxdjss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS迷宫问题相关的知识,希望对你有一定的参考价值。
1 #include<graphics.h> 2 #include<stdlib.h> 3 #include<conio.h> 4 #include<time.h> 5 #include<vector> 6 #include<queue> 7 #include<stack> 8 #include<iostream> 9 #include <algorithm> 10 11 using namespace std; 12 13 struct point{ 14 //横坐标纵坐标 15 int x; 16 int y; 17 }; 18 int **Maze; //初始化迷宫 19 point **Pre; //保存任意点在路径中的前一步 20 point move[8]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; //移动方向,横竖斜都可以,八个方向 21 char s1[]="YES"; 22 char s2[]="NO"; 23 24 void create_line(int row ,int column)//划线 25 { 26 int x, y; // 画格子 27 for (x=0; x<=10*(row+2); x+=10) 28 for (y=0; y<=10*(column+2); y+=10) 29 { 30 line(x, 0, x, 10*(column+2)); 31 line(0, y,10*(row+2), y); 32 } 33 } 34 35 36 void CreateTable(int row,int column)//初始化创建迷宫障碍区 37 { 38 int i,j; 39 srand((unsigned int)time(NULL)); 40 for(i=0; i<row+2; i++)//创建迷宫,注意到用0表示可走,1表示墙,将整个输入的迷宫再用墙围着,处理的时候就不用特别注意边界问题 41 { 42 Maze[i][0] = Maze[i][column+1] = 1; 43 } 44 for(j=0; j<column+2; j++) 45 { 46 Maze[0][j] = Maze[row+1][j] = 1; 47 } 48 49 for(i=1;i<=row;i++) 50 for(j=1;j<=column;j++) 51 { 52 Maze[i][j]=rand()%2; 53 } 54 55 for(i=1;i<=row;i++) 56 for(j=1;j<=column;j++) 57 { 58 if(Maze[i][j]==1) 59 Maze[i][j]=rand()%2; 60 } 61 62 for(i=0;i<=row+1;i++) 63 for(j=0;j<=column+1;j++) 64 { 65 if(Maze[i][j]==1) 66 { 67 setfillcolor(WHITE); 68 fillrectangle(10*j,(10+10*i),(10+10*j),10*i); 69 } 70 } 71 } 72 73 bool MazePath(int row,int column,int x,int y){ 74 //判断是否有路径从入口到出口,保存该路径(队列) 75 if(x == row && y == column)return true; 76 queue<point> q; //用于广度优先搜索 77 point now; //当前位置 78 now.x = x; 79 now.y = y; 80 q.push(now); 81 Maze[now.x][now.y] = -1; 82 while(!q.empty()){ 83 now = q.front(); 84 q.pop(); 85 for(int i=0; i<8; i++){ 86 if(now.x + move[i].x == row && now.y + move[i].y == column){ 87 Maze[now.x + move[i].x][now.y + move[i].y] = -1; 88 Pre[row][column] = now; 89 return true; 90 } 91 if(Maze[now.x + move[i].x][now.y + move[i].y] == 0){ 92 point temp; //下个位置 93 temp.x = now.x + move[i].x; 94 temp.y = now.y + move[i].y; 95 q.push(temp); 96 Maze[temp.x][temp.y] = -1; 97 Pre[temp.x][temp.y] = now; 98 99 } 100 } 101 } 102 return false; 103 } 104 105 106 void PrintPath(int row,int column){ 107 //输出最短路径 108 point temp; //保存位置 109 stack<point> s; //保存路径序列 110 temp.x = row; 111 temp.y = column; 112 while(temp.x != 1 || temp.y != 1){ 113 s.push(temp); 114 temp = Pre[temp.x][temp.y]; 115 } 116 setfillcolor(YELLOW); 117 fillrectangle(10*1,(10+10*1),(10+10*1),10*1); 118 while(!s.empty()){ 119 temp = s.top(); 120 setfillcolor(YELLOW); 121 fillrectangle(10*temp.y,(10+10*temp.x),(10+10*temp.y),10*temp.x); 122 s.pop(); 123 } 124 cout<<endl; 125 } 126 127 void result(int row,int column) 128 { 129 if(MazePath(row,column,1,1)) 130 { 131 //outtextxy(320,320,s1); 132 PrintPath(row,column); 133 } 134 else outtextxy(320,320,s2); 135 } 136 137 void Init(int row,int column) 138 { 139 Maze = new int*[row + 2]; 140 Pre = new point*[row + 2]; 141 for(int i=0; i<row+2; i++) 142 { 143 Maze[i] = new int[column + 2]; 144 Pre[i] = new point[column + 2]; 145 } 146 } 147 148 void main() 149 { 150 int row,column; 151 cin>>row>>column; 152 Init(row,column); 153 initgraph(640,640); 154 BeginBatchDraw(); 155 setlinecolor(GREEN);//设置字体颜色 156 create_line(column,row); 157 CreateTable(row,column); 158 result(row,column); 159 FlushBatchDraw(); 160 EndBatchDraw(); 161 getch(); 162 closegraph(); 163 }
以上是关于BFS迷宫问题的主要内容,如果未能解决你的问题,请参考以下文章