|

楼主 |
发表于 2023-7-9 22:51:35
|
显示全部楼层
本帖最后由 墨笠阳 于 2023-7-9 22:53 编辑
- #include<iostream>
- #include"struct.h"
- using namespace std;
- void Creat_maze(Stack& maze, int row,int col);
- int FindPath(Stack& maze, Stack& path, position* p, position* start,position* end,int row,int col);
- int main() {
- Stack maze;
- Stack path;
- position* p;
- position* start, * end;
- int row, col;
- InitStack_FindPath(path);
- InitStack_maze(maze);
- cout << "请输入行数:" ;
- cin >> row;
- cout << "\n请输入列数:";
- cin >> col;
- cout << endl;
- Creat_maze(maze,row,col);
- start = maze.base;
- end = maze.top - 1;
- p = maze.base;
- if (p) {
- cout << "NULL";
- cout << "\tx= " << p->x << "\ty= " << p->y << "\tpos= " << p->pos << "\tstep= " << p->step << endl;
- }
- p->step = 1;
- if (FindPath(maze, path, p, start,end,row, col)) {
- p = path.base;
- while (p!=path.top) {
- cout << "(" << p->x << "," << p->y << ")" << endl;
- p++;
- }
- return 1;
- }
- else {
- cout << "此迷宫无通路!" << endl;
- return 0;
- }
- }
- void Creat_maze(Stack& maze, int row, int col) {
- int i, j;
- position p;
- for (i = 0; i < row; i++) {
- p.x = i;
- for (j = 0; j < col; j++) {
- p.y = j;
- cin >> p.pos;
- Push(maze, p);
- }
- }
- }
- int FindPath(Stack& maze, Stack& path, position* p, position* start, position* end, int row, int col) {
- position* per;
- {
- //向上
- {
- per = p - col;
-
- /* // 验证per是否空
- if (per) {
- cout << "NULL";
- cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step<<endl;
- }/**/
- /**
- if (p) {
- cout << "NULL";
- cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step << endl;
- }/**/
- if (!per && per->pos == 0 && per->step == 0) {
- //!per 未越上边界
- //per->pos == 0 无障碍
- //per->step == 0 未被访问
- Push(path, *per);
- per->step = 1;
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
- //向左
- {
- per = p - 1;
- /*
- if (per) {
- cout << "NULL";
- cout << "\tx= " << per->x << "\ty= " << per->y << "\tpos= " << per->pos << "\tstep= " << per->step << endl;
- }/**/
- if (!per && p->x == per->x && per->pos == 0 && per->step == 0) {
- //!per && p->x == per->x 未越界
- Push(path, *per);
- per->step = 1;
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
-
- }
- //向下
- {
- per = p + col;
- if (!(per->x == 0 && per->y == 0 && per->pos == 1) && per->pos == 0 && per->step == 0) {
- //per->x == 0 && per->y == 0 && per->pos == 1 是position类型元素的默认值,表示maze栈外元素
- Push(path, *per);
- per->step = 1;
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
- //向右
- {
- per = p + 1;
- if (p->x == per->x && !(per->x == 0 && per->y == 0 && per->pos == 1) && per->pos == 0 && per->step == 0) {
- Push(path, *per);
- per->step = 1;
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
- //判断,是出口,return 1
- if (p == end) {
- return 1;
- }
-
- //不是出口
- else{
- //判断,是入口,return 0
- if (p == start) {
- return 0;
- }
- //不是入口,回退,
- else {
- position tem;
- Pop(path, tem);
- //以栈顶元素为新起点再遍历
- per = (maze.base + (path.top - 1)->x * col + (path.top - 1)->y);
- if (FindPath(maze, path, per, start, end, row, col)) {
- return 1;
- }
- else {
- return 0;
- }
- }
- }
- }
- }
复制代码 |
|