走迷宮問題是指在給定地圖中,從尋找一條從起點(設為左上角)到終點(設為右下角)的路徑的問題。假設迷宮形狀如下:
其中乙個方格表示乙個位置,從乙個位置有上下左右四種走法,但每個位置的四個方向上可能會有牆壁存在,牆壁用黑線表示,無法通過,要求尋找一條從左上角到右下角的路線。
深度優先搜尋可以很好地解決迷宮問題,深度優先搜尋的思路是從乙個位置開始,嘗試向某個能到達的方向走一步,在從新的位置重複這個步驟,要注意走過的位置就不要再走了,直到走到乙個無路可走的位置時返回上乙個位置,嘗試上乙個位置的另一方向。可以看出深度優先搜尋就相當於時列舉出了各種可能的路徑,像個鐵頭娃一路走到底,沒路了退一點再朝另乙個方向一路走到底,直到把出口路徑試出來,因此深度優先搜尋得到的路徑往往不是最優的。
以下是使用深度優先搜尋走迷宮的練習,後面附帶乙個用sdl對走迷宮進行視覺化的過程,程式會隨機生成迷宮地圖,並嘗試走迷宮,但是畢竟是隨機生成不保證一定有解,若存在路徑則會用紅線標註出來。sdl是乙個簡單的圖形庫,感興趣的可以了解一下。效果圖如下:
**很簡單,直接貼上,迷宮大小可以在**裡改變。maze.h和maze.cpp實現生成迷宮和走迷宮功能,將maze.cpp中的main函式注釋去掉即可執行,後面的sdltest是視覺化部分,需要配置sdl庫。
maze.h
#pragma once
#include #include #include #define mx 5
#define my 5
struct point
};class cell
bool used;
int top, down, right, left;
};class maze
} std::random_device rd;
int generate();
void print() const;
void draw() const;
//#ifdef whole
void render() const;
void renderroute() const;
// #endif
int find(int i, int j);
point getroute(int step)
bool routeempty()
void showroute();
private:
std::vector > cells;
std::vector route;
int rand1();
};
maze.cpp
#include "stdafx.h"
#include "maze.h"
void maze::showroute()
std::vector::iterator it;
for (it=route.begin();it !=route.end();it++)
}int maze::generate()
if (i>=1)
} } for (int j=0;j> a >> b;
std::cout << a << "," << b << std::endl;
if (m.find(a, b))
else std::cout << "not found" << std::endl; }}
*/
sdltest
#include "stdafx.h"
#define sdl_main_handled
#include #include #include "maze.h"
#include #define bx 66
#define by 66
#define gap 66
sdl_window *window = null;
sdl_renderer *renderer = null;
void maze::render() const
}void init()
void close()
int main()
else
break;
default:
break;
}} sdl_setrenderdrawcolor(renderer, 0, 0, 0, 0);
m.render();
sdl_setrenderdrawcolor(renderer, 250, 0, 0, 0);
m.renderroute();
sdl_renderpresent(renderer);
} return 0;
}
深度優先搜尋應用 走迷宮
走迷宮問題是深度優先搜尋的乙個典型應用,通常迷宮的形狀如下 0為可走的道路,1為牆壁。通常情況下一些變種的模型,會加入一些特殊項,有別的意思,比如數字5代表鑰匙,當然複雜模型先不討論,從最簡單的開始。include include include include using namespace st...
走迷宮(深度優先搜尋版)
includeusing namespace std int a 50 50 book 50 50 n,m,p,q 定義全域性變數,二維陣列a用來儲存n行m列的迷宮,book陣列用來標記。p,q為目的地座標,min記錄最小步數 void dfs int x,int y,int step dfs函式用...
DFS深度優先搜尋之走迷宮
走迷宮 problem description 乙個由n m個格仔組成的迷宮,起點是 1,1 終點是 n,m 每次可以向上下左右四個方向任意走一步,並且有些格仔是不能走動,求從起點到終點經過每個格仔至多一次的走法數。input 第 一行乙個整數t 表示有t 組測試資料。t 110 對於每組測試資料 ...