深度優先搜尋走迷宮 SDL視覺化

2021-08-21 13:19:45 字數 2333 閱讀 4687

走迷宮問題是指在給定地圖中,從尋找一條從起點(設為左上角)到終點(設為右下角)的路徑的問題。假設迷宮形狀如下:

其中乙個方格表示乙個位置,從乙個位置有上下左右四種走法,但每個位置的四個方向上可能會有牆壁存在,牆壁用黑線表示,無法通過,要求尋找一條從左上角到右下角的路線。

深度優先搜尋可以很好地解決迷宮問題,深度優先搜尋的思路是從乙個位置開始,嘗試向某個能到達的方向走一步,在從新的位置重複這個步驟,要注意走過的位置就不要再走了,直到走到乙個無路可走的位置時返回上乙個位置,嘗試上乙個位置的另一方向。可以看出深度優先搜尋就相當於時列舉出了各種可能的路徑,像個鐵頭娃一路走到底,沒路了退一點再朝另乙個方向一路走到底,直到把出口路徑試出來,因此深度優先搜尋得到的路徑往往不是最優的。

以下是使用深度優先搜尋走迷宮的練習,後面附帶乙個用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 對於每組測試資料 ...