数据结构 C语言 双向链栈 迷宫问题
2017-07-03 21:25
579 查看
【问题描述】
以一个mXn的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】
实现链栈求解迷宫从入口到出口的一条可行通路。
【测试数据】
迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/03/9750ebb84fffb1441eee0aeee80070ad)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/03/b7d5164de11b491d7fe0f7c368c17eba)
以一个mXn的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】
实现链栈求解迷宫从入口到出口的一条可行通路。
【测试数据】
迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
#include<stdio.h> #include<stdlib.h> int count = 0; typedef struct { int x, y; }position; typedef struct node{ position data; struct node *next, *pre; }linkNode; typedef struct { linkNode *head; linkNode *top; }linkStack; int initStack(linkStack *s) { s->head = (linkNode*)malloc(sizeof(linkNode)); s->top = s->head; s->top->next = NULL; s->top->pre = NULL; } int pushStack(linkStack *s, position value) { linkNode *p; p = (linkNode*)malloc(sizeof(linkNode)); s->top->data = value; p->next = s->top->next; p->pre = s->top; s->top->next = p; s->top = p; count++; return 0; } int popStack(linkStack *s, position *nowPos) { s->top = s->top->pre; free(s->top->next); count--; *nowPos = s->top->pre->data; } int main() { linkStack s; linkNode *p; position nowPos, startPos, endPos; int i, m, n, j; int **map; initStack(&s); printf("请输入行列数\n"); scanf("%d%d", &m, &n); map = (int**)malloc(sizeof(int)*m); for (i = 0; i < m; i++) { map[i] = (int*)malloc(sizeof(int)*n); } printf("请输入地图:\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &map[i][j]); } } printf("\n"); printf("请输入开始位置和结束位置:\n"); scanf("%d %d", &startPos.x, &startPos.y); scanf("%d %d", &endPos.x, &endPos.y); nowPos = startPos; pushStack(&s, nowPos); while ((nowPos.x != endPos.x) || (nowPos.y != endPos.y)) { if (0 == map[nowPos.x + 1][nowPos.y]) { nowPos.x += 1; map[nowPos.x][nowPos.y] = 2; pushStack(&s, nowPos); } else if (0 == map[nowPos.x][nowPos.y - 1]) { nowPos.y -= 1; map[nowPos.x][nowPos.y] = 2; pushStack(&s, nowPos); } else if (0 == map[nowPos.x - 1][nowPos.y]) { nowPos.x -= 1; map[nowPos.x][nowPos.y] = 2; pushStack(&s, nowPos); } else if (0 == map[nowPos.x][nowPos.y + 1]) { nowPos.y += 1; map[nowPos.x][nowPos.y] = 2; pushStack(&s, nowPos); } else { map[nowPos.x][nowPos.y] = 2; popStack(&s, &nowPos); } } printf("路径为:\n"); for (i = 0, p = s.head; i < count; i++,p = p->next) { printf("%d,%d\n", p->data.x, p->data.y); } system("pause"); return 0; }
相关文章推荐
- 【数据结构】迷宫问题求解(链栈,DFS)
- 迷宫问题的通用解法C语言数据结构实现
- 数据结构 C语言 队列 迷宫问题
- 回溯算法解迷宫问题(C语言)
- c语言的符号和引用问题数据结构C语言 ->含义是
- 迷宫问题--非递归回溯 C语言实现
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- 关于c语言写数据结构时类型替换的问题
- 数据结构:栈和队列-迷宫问题求解
- .数据结构迷宫问题的文档
- C语言用顺序栈求解迷宫问题
- 数据结构C语言实现之链栈
- C语言实现数据结构中的链栈
- C语言数据结构----双向链表
- C语言数据结构----双向链表
- 迷宫问题的双向BFS
- 用C语言实现迷宫求解问题
- 约瑟夫环问题 数据结构 c语言
- 回溯法( Backtracking Algorithms ) :C语言Maze迷宫问题(自己实现)
- 迷宫问题C语言实现