Maze problem
Title Description
Define a 2D array:
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,
};
It represents a maze, in which 1 represents the wall, 0 represents the path that can be walked, can only walk horizontally or vertically, can't walk obliquely, and requires programming to find the shortest path from the upper left corner to the lower right corner.
input
A 5 × 5 two-dimensional array represents a maze. Data guarantees a unique solution.
output
The shortest path from the upper left corner to the lower right corner, in the format shown in the example.
Example
Sample Input
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
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
meaning of the title
Very simple search questions can open a structure array to record the precursor of each point entering the queue, then the final reverse output is enough
AC code
#include <cstdio>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
struct node {
int x, y;
int st;
node(int _x=0, int _y=0, int _st=0):x(_x),y(_y),st(_st){}
};
node p[100][100], pre[100];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
bool vis[100][100];
int mps[10][10];
bool check(int x, int y) {
return x>=1&&x<=5&&y>=1&&y<=5;
}
void bfs() {
node tmp;
queue<node> que;
que.push(node(1,1,0));
vis[1][1] = true;
while(!que.empty()) {
tmp = que.front();
que.pop();
if(tmp.x==5 && tmp.y==5)
break;
for(int i = 0; i < 4; i++) {
int xx = tmp.x+dx[i];
int yy = tmp.y+dy[i];
if(check(xx,yy) && !vis[xx][yy] && !mps[xx][yy]) {
vis[xx][yy] = true;
p[xx][yy] = tmp;
int zz = tmp.st+1;
que.push(node(xx,yy,zz));
}
}
}
int kk = tmp.st;
for(int i = kk; i >= 0; i--) {
pre[i] = tmp;
tmp = p[tmp.x][tmp.y];
}
for(int i = 0; i <= kk; i++) {
printf("(%d, %d)\n",pre[i].x-1,pre[i].y-1);
}
}
int main() {
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= 5; j++) {
cin >> mps[i][j];
}
}
bfs();
return 0;
}