300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 基础数据结构【三】————老鼠走迷宫问题————堆栈应用

基础数据结构【三】————老鼠走迷宫问题————堆栈应用

时间:2021-05-09 15:12:01

相关推荐

基础数据结构【三】————老鼠走迷宫问题————堆栈应用

假设:老鼠在一个二维地图中i行走,地图中大部分路径被墙阻断,无法前进。老鼠可以按照尝试错误的方法找到出口。只是,这只老鼠必须具备走错路时候就退回来,并且把走过的路记下来,避免下次走重复路,知道找到出口。

1.一次只能走一格。

2.遇到墙饰无法前进,退回,找其他方向的路,看是否可以走通。

3.走过的路不会在走第二次。

先利用二维数组MAZE[row][col]生成仿真迷宫,

MAZE[i][j] = 1 ,表示[i][j]位置处有墙,无法通过

MAZE[i][j] = 10,表示[i][j]位置处无墙,可以通过

MAZE[1][1] 为入口,MAZE[m][n]为出口,迷宫地图如下

int MAZE[10][12] = { 1,1,1,1,1,1,1,1,1,1,1,1, //声明迷宫数组

1,0,0,0,1,1,1,1,1,1,1,1,

1,1,1,0,1,1,0,0,0,0,1,1,

1,1,1,0,1,1,0,1,1,0,1,1,

1,1,1,0,0,0,0,1,1,0,1,1,

1,1,1,0,1,1,0,1,1,0,1,1,

1,1,1,0,1,1,0,1,1,0,1,1,

1,1,1,1,1,1,0,1,1,0,1,1,

1,1,0,0,0,0,0,0,1,0,0,1,

1,1,1,1,1,1,1,1,1,1,1,1 };

//int main()//{// std::cout << "Hello World!\n";//}#include <iostream>#define EAST MAZE[x][y+1]//定义东方的相对位置#define WEST MAZE[x][y-1]//定义西方的相对位置#define SOUTH MAZE[x+1][y]//定义南方的相对位置#define NORTH MAZE[x-1][y]//定义北方的相对位置using namespace std;const int ExitX = 8;//定义出口的X坐标在第8行const int ExitY = 10;//定义出口的Y坐标在第10列struct list{int x, y;struct list* next;}; typedef struct list node;typedef node* link;int MAZE[10][12] = { 1,1,1,1,1,1,1,1,1,1,1,1,//声明迷宫数组1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1 };link push(link stack, int x, int y);link pop(link stack, int* x, int* y);int chkExit(int, int, int, int);int main(void){int i, j;link path = NULL;int x = 1;//入口的X坐标int y = 1; //入口的Y坐标cout << "[迷宫的路径(0的部分)]" << endl; //打印出迷宫的路径图for (i = 0; i < 10; i++){for (j = 0; j < 12; j++)cout << MAZE[i][j] << " ";cout << endl;}while (x <= ExitX && y <= ExitY){MAZE[x][y] = 2;if (NORTH == 0){x -= 1;path = push(path, x, y);}else if (SOUTH == 0){x += 1;path = push(path, x, y);}else if (WEST == 0){y -= 1;path = push(path, x, y);}else if (EAST == 0){y += 1;path = push(path, x, y);}else if (chkExit(x, y, ExitX, ExitY) == 1)//检查是否走到出口了break;else{MAZE[x][y] = 2;path = pop(path, &x, &y);}}cout << "[老鼠走过的路径(2的部分)]" << endl; //打印出老鼠成功走出迷宫的路径图for (i = 0; i < 10; i++){for (j = 0; j < 12; j++)cout << MAZE[i][j] << " ";cout << endl;}system("pause");return 0;}link push(link stack, int x, int y){link newnode;newnode = new node;if (!newnode){cout << "Error!内存分配失败!" << endl;return NULL;}newnode->x = x;newnode->y = y;newnode->next = stack;stack = newnode;return stack;}link pop(link stack, int* x, int* y){link top;if (stack != NULL){top = stack;stack = stack->next;*x = top->x;*y = top->y;delete top;return stack;}else*x = -1;return stack;}int chkExit(int x, int y, int ex, int ey){if (x == ex && y == ey){if (NORTH == 1 || SOUTH == 1 || WEST == 1 || EAST == 2)return 1;if (NORTH == 1 || SOUTH == 1 || WEST == 2 || EAST == 1)return 1;if (NORTH == 1 || SOUTH == 2 || WEST == 1 || EAST == 1)return 1;if (NORTH == 2 || SOUTH == 1 || WEST == 1 || EAST == 1)return 1;}return 0;}

#include <iostream>////连接图像中断裂的边缘//以某一点(i,j)为中心,分析它的八邻域//int ConnectEdge(IplImage* src){if (NULL == src)return 1;int width = src->width;int height = src->height;uchar* data = (uchar*)src->imageData;for (int i = 2; i < height - 2; i++){for (int j = 2; j < width - 2; j++){//如果该中心点为255,则考虑它的八邻域if (data[i * src->widthStep + j] == 255){int num = 0;for (int k = -1; k < 2; k++){for (int l = -1; l < 2; l++){//如果八邻域中有灰度值为0的点,则去找该点的十六邻域if (k != 0 && l != 0 && data[(i + k) * src->widthStep + j + l] == 255)num++;}}//如果八邻域中只有一个点是255,说明该中心点为端点,则考虑他的十六邻域if (num == 1){for (int k = -2; k < 3; k++){for (int l = -2; l < 3; l++){//如果该点的十六邻域中有255的点,则该点与中心点之间的点置为255if (!(k < 2 && k > -2 && l < 2 && l > -2) && data[(i + k) * src->widthStep + j + l] == 255){data[(i + k / 2) * src->widthStep + j + l / 2] = 255;}}}}}}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。