1. 程式人生 > >資料結構之簡單迷宮求解

資料結構之簡單迷宮求解

迷宮問題我們都知道,在一張地圖中尋找一條路可以走出去,所以我們可以建立這樣一個地圖
這裡寫圖片描述
如圖所示,我們的思路是這樣的:我們可以規定0就是牆,而1 就是我們要走的路,可以落腳後,我們就將走過的點標記為2
然後順時針遞迴探測下一個可以落腳的點,通過回溯法,我們就可以通過棧結構完成我們最簡單的迷宮尋路
回溯法
我們從入口點進入,進行搜尋路線,如果我們發現當前道路不通的時候,我們就會回溯到上一個點,然後判斷能不能繼續走,如果還是不能,那麼我們就繼續回溯,直到找到可以走的點
下面就是我們的程式碼具體實現

maze.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h> #define MAX_ROW 6 #define MAX_COL 6 typedef struct maze{ int map[MAX_ROW][MAX_COL]; }maze; typedef struct point{ int row; int col; }point; typedef point seqstacktype; typedef struct seqstack{ seqstacktype *data; size_t size; size_t capacity; }seqstack;
maze.c


#include "maze.h"


int map[MAX_ROW][MAX_COL] = {
    {0,1,0,0,0,0},
    {0,1,1,1,0,0},
    {0,1,0,1,1,0},
    {0,1,1,0,0,0},
    {0,0,1,0,0,0},
    {0,0,1,0,0,0}
};
void mazeinit(maze *maze)
{
    if(maze == NULL)
    {
        return;
    }
    size_t i = 0;
    for(;i<MAX_ROW;i++)
    {
        size_t j = 0;
        for
(;j<MAX_COL;j++) { maze->map[i][j] = map[i][j]; } } return; } void mazeprint(maze *maze) { if(maze == NULL) { return; } size_t i = 0; for(;i<MAX_ROW;i++) { size_t j = 0; for(;j<MAX_COL;j++) { printf("%2d",maze->map[i][j]); } printf("\n"); } } int canstay(maze *maze,point cur) { if(cur.row < 0 ||cur.row > MAX_ROW || cur.col < 0 ||cur.col >MAX_COL) { return 0; } if(maze->map[cur.row][cur.col] == 1) { return 1; } return 0; } void mark(maze *maze,point cur) { maze->map[cur.row][cur.col] = 2; return; } int isexit(maze *maze,point cur,point entry) { if(cur.row == entry.row &&cur.col == entry.col) { //說明檢測的當前點就是入口點 return 0; } if(cur.row == 0 || cur.row == MAX_ROW-1 || cur.col == 0 || cur.col == MAX_COL-1) { return 1; } return 0; } void _getpash(maze *maze,point cur,point entry,seqstack *cur_pash,seqstack *short_pash) { printf("cur:(%d,%d)\n",cur.row,cur.col); if(!canstay(maze,cur)) { return; } mark(maze,cur); seqstack_pushback(cur_pash,cur); if(isexit(maze,cur,entry)) { printf("找到一條出口\n"); return; } point up = cur; up.row -= 1; _getpash(maze,up,entry); point right = cur; right.col += 1; _getpash(maze,up,entry); point down = cur; down.row += 1; _getpash(maze,up,entry); point left = cur; left.col -= 1; _getpash(maze,up,entry); } void getpath(maze *maze,point entry) { if(maze == NULL) { return; } _getpash(maze,entry,entry); }
test函式

void test_maze()
{
    maze maze;
    mazeinit(&maze);
    point entry = {0,1};
    getpath(&maze,entry);
    mazeprint(&maze);

}
int main()
{
    test_maze();
    return 0;
}

相關推薦

資料結構簡單迷宮求解

迷宮問題我們都知道,在一張地圖中尋找一條路可以走出去,所以我們可以建立這樣一個地圖 如圖所示,我們的思路是這樣的:我們可以規定0就是牆,而1 就是我們要走的路,可以落腳後,我們就將走過的點標記為2 然後順時針遞迴探測下一個可以落腳的點,通過回溯法,我們就

C語言複習資料結構簡單的二叉樹輸入和輸出操作

C語言複習之簡單的二叉樹的僅輸入輸出操作 1:結構體 typedef struct TreeNode{ _Data value; struct TreeNode * father; struct TreeNode * right; stru

資料結構迷宮求解

//SeqStack.h #pragma once #include<stdio.h> #include<stddef.h> #include<windows.h> #define MAZE_ROW 6 //行 #def

資料結構求解RMQ問題

RMQ,即range minimum queuy,範圍最小值查詢,一般樸素演算法查詢單個區間是O(n),查詢m個就是O(m*n) ,這裡要說的Sparse-Table演算法,需要O(nlog n)的預處理,O(1)的單次查詢,在查詢次數很多的時候就能體現更好的優越性。而且,最重要的是這個演算法寫

資料結構內部排序--簡單選擇排序

目錄 概要 演算法思想 演算法分析 穩定性與時間複雜度 Python程式碼清單 有什麼問題請聯絡我 概要 -IDE:Pycharm -Python版本:python3.x -演算法分類:內部排序->選擇類排序->簡單選擇排序 演算法思想 第

資料結構線索二叉樹的簡單實現

二叉樹的鏈式儲存時會有較多空間的浪費,當一顆有 n 個節點的二叉樹儲存共有2n個指標域,但是隻有n-1個被用到,所以剩下的n+1個都會被浪費掉,因此可以想一種辦法把剩餘的空間利用起來,線索二叉樹應運而生。 將二叉樹重新定義如下每個節點為下列形式 lchild l

資料結構二叉搜尋樹的簡單實現(C++實現)

功能 插入:insert() 查詢:search() 刪除:remove() 清除整個樹:clear() 最大值:max() 最小值:min() 前序遍歷:PreOrder() 中序遍歷:InOrder() 後序遍歷:PostOrder() 注:此二叉樹允許插入相同的值,且預設將其放在右

資料結構用棧實現迷宮問題(dfs)

給一個n*n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析  :詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不

資料結構 佇列(Queue)的實現及簡單操作

在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能

C資料結構棧的應用:括號匹配和簡單計算器

堆疊是一種資料項按序排列的資料結構,只能在其一端進行插入和刪除。括號匹配和表示式求值是堆疊的兩個典型應用。1.找到無法匹配的左右括號,輸出原字串,失配的左括號下打&,右括號下打? 輸入包括多組資料,每組資料一行,包含一個字串,只包含左右括號和大小寫字母,字元長度不超過

資料結構簡單不帶環迷宮的實現(用棧實現)

一.用棧來實現簡單的迷宮1. 迷宮:回溯法:對一個包括有很多個結點,每個結點有若干個搜尋分支的問 題,把原問題分解為若干個子問題求解的演算法;當搜尋到某個結點發 現無法再繼續搜尋下去時,就讓搜尋過程回溯(回退)到該節點的前一 個結點,繼續搜尋該節點外的其他尚未搜尋的分支;

Algorithm——簡單資料結構佇列和連結串列(十三)

Algorithm——簡單資料結構之佇列和連結串列佇列是一種先進先出策略,而連結串列中的各元素按線性順序排列。陣列的線性順序是由陣列的下標決定的,但連結串列的順序是由各個物件裡的指標決定的。佇列有入隊和出隊操作,連結串列則有插入、刪除、查詢表中節點的操作。佇列和雙向連結串列的

資料結構】遞迴求解迷宮問題

 資料結構 遞迴求解迷宮問題 參考程式碼如下: /* 名稱:遞迴求解迷宮問題 編譯環境:VC++ 6.0 日期: 2014年4月1日 */ #include<stdio.h> #include<windows.h> // 迷宮座標位置型別 s

(七)資料結構搜尋二叉樹的簡單實現

1、搜尋二叉樹的簡單定義 二叉搜尋樹(BST, Binary Search Tree), 也稱二叉排序樹或者二叉查詢樹。定義:a、是一顆二叉樹,可以為空,也可以不為空。b、非空左子樹的所有鍵值小於其根結點的鍵值c、非空右子樹的所有鍵值大於其根結點的鍵值。d、左、右子樹都是二

演算法與資料結構排序演算法的相關知識,簡單易懂。

一、    氣泡排序 1)  概要 本章介紹排序演算法中的氣泡排序,重點講解氣泡排序的思想。 目錄 1. 氣泡排序介紹 2. 氣泡排序圖文說明 3. 氣泡排序的時間複雜度和穩定性 4. 氣泡排序實現 4.1 氣泡排序C實現 4.2 氣泡排序C++實現 4.

(一)資料結構線性表的簡單實現:連結串列

/* 查詢連結串列中第K個元素 */ List *FindKth( int K, List *PtrL ) { List *p = PtrL; int i = 1; while (p != NULL && i < K ) { p = p->Next; i++;

演算法與資料結構堆的相關知識,簡單易懂。

十、 二叉堆之Java的實現 1) 概要 前面分別通過C和C++實現了二叉堆,本章給出二叉堆的Java版本。還是那句話,它們的原理一樣,擇其一瞭解即可。 目錄 1. 二叉堆的介紹 2. 二叉堆的圖文解析 3. 二叉堆的Java實現(完整原始碼) 4. 二叉堆的Java測試程式

簡單資料結構 vector 棧(C++ vector 實現)

/* ============================================================================ Name : stack_array.cpp Author : ntsk13 [em

資料結構堆的簡單實現

堆的主要介面包括,堆的初始化,堆的銷燬,堆的插入,堆的刪除,獲取堆頂的資料,判斷堆是否為空,求堆的大小,以及堆的氣泡排序。在這裡還有堆的簡單的資料結構的實現。因為堆是動態增長的,所以實現堆的資料結構裡包含一個存放資料的堆的陣列data,堆的大小sz,以及堆的容量capacit

資料結構單鏈表的幾個簡單演算法題

        單鏈表作為最基本的資料結構,在程式設計中有著非常重要的運用。最近自己閒下來,正在整理資料結構和演算法的一些程式題,現將自己的程式碼貼出來與大家分享。如有不對之處,請大家指正。(好吧 ,這麼簡單的題目應該不會有錯,都測試過了。況且說的好像很多人看我部落格一樣。