题目
解题思路
本题为迷宫问题bfs解题的样板题,bfs主要需利用队列来存储搜索过程中的各种分支情况。注意标记已经走过的点、不能行走的点和迷宫边界等细节,便可以搜索出最短路径。需要将bfs函数部分理解并熟记,以不变应万变。本题具体代码如下:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#define ll long long
#define FOR(i,a,n) for(register int i=a;i<n;i++)
#define RF(i,a,n) for(register int i=a;i>n;i--)
#define NIL -1
using namespace std;
struct node{
int x;
int y;
};
int flag[6][6],num[6][6];
struct node pa[6][6];
int mx[5] = {-1,1,0,0};
int my[5] = {0,0,1,-1};
bool judge(int x, int y)
{
if(x <= 4 && x >= 0 && y <= 4 && y >= 0)
{
return true;
}
else
{
return false;
}
}
bool bfs(node &s, node &e)
{
queue<node> q;
q.push(s);
while(!q.empty())
{
node temp = q.front();
q.pop();
flag[temp.x][temp.y] = 1;
if(temp.x == e.x && temp.y == e.y)
{
return true;
}
for(int i = 0; i < 4; i++)
{
struct node tmp;
tmp.x = temp.x + mx[i];
tmp.y = temp.y + my[i];
if(!flag[tmp.x][tmp.y] && !num[tmp.x][tmp.y])
{
if(judge(tmp.x,tmp.y))
{
pa[tmp.x][tmp.y] = temp;
q.push(tmp);
}
}
}
}
return false;
}
int main()
{
memset(flag,0,sizeof(flag));
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
cin >> num[i][j];
}
}
node start,end;
start.x = 4;
start.y = 4;
end.x = 0;
end.y = 0;
if(bfs(start,end));
{
node temp;
temp.x = end.x;
temp.y = end.y;
while(temp.x != start.x || temp.y != start.y)
{
cout << "(" << temp.x << ", " << temp.y << ")" << endl;
temp = pa[temp.x][temp.y];
}
cout << "(" << start.x << ", " << start.y << ")" << endl;
}
return 0;
}