原题
题意
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
}; 0 代表可以走 ,1 代表障碍 。只有4个方向可以走
Input
一个5 × 5的二维数组,表示一个迷宫
Output
左上角到右下角的最短路径
解题思路:
最短路径的问题一般使用 bfs 宽度优先算法
代码示例:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int vis[6][6];
int a[6][6];
struct node{ // 结构体中存放 点坐标 及步数
int x;
int y;
int step;
};
bool judge(int x,int y){ // judge 函数判断是否出界或是否走过
if(x < 0 || y < 0 || x > 4 || y > 4 || vis[x][y] || a[x][y]){
return false;
}
return true;
}
void bfs(int x,int y){
memset(vis,0,sizeof(vis));
vis[0][0] = 1;
node p;
p.step = 0;
p.x = x;
p.y = y;
queue<node> Q;
queue<node> qq;
qq.push(p);
Q.push(p);
while(!Q.empty()){
p = Q.front();
Q.pop();
if(p.x == 4 && p.y == 4){ // 到达最终节点
break ;
}
for(int i = 0;i < 4;i++){ 入队的情况有4中,有可能都入队
node pn;
pn.x = p.x + dx[i];
pn.y = p.y + dy[i];
if(judge(pn.x,pn.y)){
pn.step = p.step + 1; // 步数加一
vis[pn.x][pn.y] = 1;
Q.push(pn); // 符合的情况入队
qq.push(pn);
}
}
}
int i=0;
while(!qq.empty()){
node k;
k = qq.front();
qq.pop();
if(k.step == i){ // 打印与步数相同的 点坐标
printf("(%d, %d)\n",k.x,k.y);
i++;
}
}
}
int main(){
for(int i = 0;i < 5;i++){
for(int j = 0;j < 5;j++){
scanf("%d",&a[i][j]);
}
}
bfs(0,0);
return 0;
}