基础数据结构【三】————老鼠走迷宫问题————堆栈应用
假設:老鼠在一個二維地圖中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;}}}}}}}
}
?
總結
以上是生活随笔為你收集整理的基础数据结构【三】————老鼠走迷宫问题————堆栈应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区什么时候关门
- 下一篇: 基础数据结构【四】————环形链表与多项