国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


1、題目描述

題目鏈接:迷宮問(wèn)題
數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,筆記、
數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,筆記
注意不能斜著走!

2、題目分析

(1)0為可以走,1不能走且只有唯一一條通路
(2)我們可以通過(guò)判斷上下左右來(lái)確定路是否能通過(guò),再設(shè)置如果走過(guò)的路就用 2 來(lái)標(biāo)記,這樣就不會(huì)走回頭路了,如果有多條能通過(guò),只選擇一條路來(lái)走
(3)當(dāng)我們遇到死胡同時(shí),應(yīng)該返回到上一個(gè)位置,再重新判斷其他路是否可以走,沒(méi)有就繼續(xù)往回退,直到找到下一條路來(lái),像這樣的我們就要用到遞歸了。
(4)因?yàn)樽鴺?biāo)是2個(gè)數(shù)據(jù)所以我們創(chuàng)建一個(gè)結(jié)構(gòu)體來(lái)記錄坐標(biāo)。
(5)我們?cè)谝贿M(jìn)到函數(shù)就先保存坐標(biāo),再找其他的路,如果沒(méi)有找到就說(shuō)明這是一條死胡同,我們就要往后退,再這個(gè)過(guò)程我們還需要將進(jìn)來(lái)保存的坐標(biāo)給拿出來(lái),這種后進(jìn)先出的的數(shù)據(jù)結(jié)構(gòu)是棧,所以我們要借助棧來(lái)實(shí)現(xiàn),不懂棧的可以看看哦:棧
(6)因?yàn)闂J窍冗M(jìn)后出的,所以這跟題目要求不符合,所以我們要再創(chuàng)建一個(gè)棧,將另一個(gè)棧的數(shù)據(jù)倒到新的棧里,再輸出就符合題目要求了
(7)注意:輸出的格式、在結(jié)尾還要釋放棧和創(chuàng)建的數(shù)組、題目可能要求多組測(cè)試用例

3、代碼實(shí)現(xiàn)

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//定義結(jié)構(gòu)體,標(biāo)記坐標(biāo)
typedef struct Postion {
    int row;//行
    int col;//列
} PT;
///
//棧
typedef PT STDataType;//結(jié)構(gòu)體類(lèi)型
typedef struct Stack {
    STDataType* a;
    int top;//元素個(gè)數(shù)
    int capacity;//空間大小
} ST;

void StackInit(ST* ps);
void StackDestory(ST* ps);
// 入棧
void StackPush(ST* ps, STDataType x);
// 出棧
void StackPop(ST* ps);
STDataType StackTop(ST* ps);

int StackSize(ST* ps);
bool StackEmpty(ST* ps);

void StackInit(ST* ps) {
    assert(ps);

    ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
    if (ps->a == NULL) {
        printf("malloc fail\n");
        exit(-1);
    }

    ps->capacity = 4;
    ps->top = 0;
}

void StackDestory(ST* ps) {
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->top = ps->capacity = 0;
}

// 入棧
void StackPush(ST* ps, STDataType x) {
    assert(ps);

    // 滿(mǎn)了-》增容
    if (ps->top == ps->capacity) {
        STDataType* tmp = (STDataType*)realloc(ps->a,
            ps->capacity * 2 * sizeof(STDataType));
        if (tmp == NULL) {
            printf("realloc fail\n");
            exit(-1);
        }
        else {
            ps->a = tmp;
            ps->capacity *= 2;
        }
    }

    ps->a[ps->top] = x;
    ps->top++;
}

// 出棧
void StackPop(ST* ps) {
    assert(ps);
    // 棧空了,調(diào)用Pop,直接中止程序報(bào)錯(cuò)
    assert(ps->top > 0);

    //ps->a[ps->top - 1] = 0;
    ps->top--;
}

STDataType StackTop(ST* ps) {
    assert(ps);
    // 棧空了,調(diào)用Top,直接中止程序報(bào)錯(cuò)
    assert(ps->top > 0);

    return ps->a[ps->top - 1];
}

int StackSize(ST* ps) {
    assert(ps);

    return ps->top;
}

bool StackEmpty(ST* ps) {
    assert(ps);

    return ps->top == 0;
}

///
ST Pata;//棧
//判斷是否有路
bool IsPass(int** maze, int N, int M, PT pos) {
    //(1)判斷是否越界
    //(2)判斷坐標(biāo)是否為0
    if (pos.row >= 0 && pos.row < N
        && pos.col >= 0 && pos.col < M
        && maze[pos.row][pos.col] == 0
        ) {
        return true;
    }
    else {
        return false;
    }

}

//打印
void PrintPatar(ST*pata) {
    //再設(shè)置一個(gè)棧
    ST patar;
    StackInit(&patar);
    //將pata這個(gè)棧倒到patar棧里
    while (!StackEmpty(pata)) {
        StackPush(&patar, StackTop(pata));
        StackPop(pata);
    }
    while (!StackEmpty(&patar)) {
        PT top = StackTop(&patar);
        printf("(%d,%d)\n", top.row, top.col);//按照題目的要求打印
        StackPop(&patar);
    }
    //釋放
    StackDestory(&patar);
}

bool GetMazePath(int** maze, int N, int M, PT cur) {
    //先入棧
    StackPush(&Pata, cur);
    //改變當(dāng)前位置
    maze[cur.row][cur.col] = 2;
    //判斷是否到出口
    if (cur.row == N - 1 && cur.col == M - 1)
        return true;
    //接下來(lái)我們分上下左右判斷是否有路可走
    //上
    //記錄上的位置
    PT next = cur;
    next.row -= 1;
    if (IsPass(maze, N, M, next)) {
        //有就進(jìn)行遞歸
        if (GetMazePath(maze, N, M, next))
            //真的有路就返回真即可
            return true;
    }
    //下
     //記錄下的位置
    next = cur;
    next.row += 1;
    if (IsPass(maze, N, M, next)) {
        if (GetMazePath(maze, N, M, next))
            return true;
    }
    //左
     //記錄左的位置
    next = cur;
    next.col -= 1;
    if (IsPass(maze, N, M, next)) {
        if (GetMazePath(maze, N, M, next))
            return true;
    }
    //右
     //記錄右的位置
    next = cur;
    next.col += 1;
    if (IsPass(maze, N, M, next)) {
        if (GetMazePath(maze, N, M, next))
            return true;
    }
    StackPop(&Pata);
    //走到?jīng)]路了就返回假
    return false;
}

int main() {
    int N = 0, M = 0;//行和列的大小
    while (scanf("%d%d", &N, &M) != EOF) {//可能會(huì)有多組測(cè)試用例
        //內(nèi)存函數(shù)造一個(gè)二維數(shù)組
        int** maze = (int**)malloc(sizeof(int*) * N);
        for (int i = 0; i < N; i++)
            maze[i] = (int*)malloc(sizeof(int) * M);
        //輸入迷宮,0代表可過(guò),1代表不通
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                scanf("%d", &maze[i][j]);
            }
        }
        //初始化,入口
        PT S = { 0, 0 };
        //初始化棧
        StackInit(&Pata);
        //實(shí)行
        GetMazePath(maze, N, M, S);
        //打印
        PrintPatar(&Pata);
        //釋放棧
        StackDestory(&Pata);
        //釋放空間
        for (int i = 0; i < N; i++)
            free(maze[i]);
        free(maze);
        maze = NULL;
    }

    return 0;
}

遞歸過(guò)程:
假設(shè)迷宮:

數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,筆記
數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語(yǔ)言,算法,筆記
這就是走整個(gè)迷宮的流程

以上就是我的分享了,如果有什么錯(cuò)誤,歡迎在評(píng)論區(qū)留言。
最后,謝謝大家的觀(guān)看!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761174.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 迷宮求解(包含隨機(jī)迷宮、求解動(dòng)畫(huà)演示)——C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)

    迷宮求解(包含隨機(jī)迷宮、求解動(dòng)畫(huà)演示)——C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)

    該程序是一項(xiàng) “迷宮求解” 類(lèi)問(wèn)題,主要功能包含: ????????①25 X 25迷宮的隨機(jī)生成 ????????②迷宮求解的動(dòng)畫(huà)演示(DFS) 完整代碼附最后 : ) 功能演示: 界面展示: ?迷宮展示: 結(jié)果展示: ? 首先是隨機(jī)迷宮部分: 大概思路就是先初始化一個(gè)矩陣,外圈為“通

    2024年02月07日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題

    數(shù)據(jù)結(jié)構(gòu)-迷宮問(wèn)題

    題目鏈接:迷宮問(wèn)題 、 注意不能斜著走! (1)0為可以走,1不能走且只有唯一一條通路 (2)我們可以通過(guò)判斷上下左右來(lái)確定路是否能通過(guò),再設(shè)置如果走過(guò)的路就用 2 來(lái)標(biāo)記,這樣就不會(huì)走回頭路了,如果有多條能通過(guò),只選擇一條路來(lái)走 (3)當(dāng)我們遇到死胡同時(shí),應(yīng)

    2024年02月04日
    瀏覽(14)
  • 【C數(shù)據(jù)結(jié)構(gòu)】迷宮問(wèn)題

    【C數(shù)據(jù)結(jié)構(gòu)】迷宮問(wèn)題

    前言: 本章記錄作者學(xué)習(xí)中,遇到的兩個(gè)比較有趣的問(wèn)題,一個(gè)簡(jiǎn)單和一個(gè)較復(fù)雜的迷宮問(wèn)題。 ? ? 讓我們先來(lái)看簡(jiǎn)單的:迷宮問(wèn)題 它的具體要求: 輸入描述: 輸入兩個(gè)整數(shù),分別表示二維數(shù)組的行數(shù),列數(shù)。再輸入相應(yīng)的數(shù)組,其中的 1表示墻壁 , 0表示可以走的路 。

    2024年02月02日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】迷宮問(wèn)題實(shí)現(xiàn)(包含界面)

    【數(shù)據(jù)結(jié)構(gòu)】迷宮問(wèn)題實(shí)現(xiàn)(包含界面)

    ???? 問(wèn)題描述:假設(shè)迷宮由m行n列構(gòu)成,有一個(gè)入口和一個(gè)出口,入口坐標(biāo)為(1,1),出口坐標(biāo)為(m,n),試設(shè)計(jì)并驗(yàn)證一下算法:找出一條入口通往出口的路徑,或報(bào)告一個(gè)\\\"無(wú)法通過(guò)\\\"的信息。 具體需求如下: 用C語(yǔ)言實(shí)現(xiàn)順序存儲(chǔ)結(jié)構(gòu)上隊(duì)列的基本操作,然后利用該隊(duì)列的基本操

    2024年02月04日
    瀏覽(12)
  • 數(shù)據(jù)結(jié)構(gòu)——迷宮問(wèn)題(順序棧、C++)

    數(shù)據(jù)結(jié)構(gòu)——迷宮問(wèn)題(順序棧、C++)

    ?講解: 一、采用二維數(shù)組和srand函數(shù)隨機(jī)生成只有0和1的迷宮。 二、求解迷宮大概思路:先將入口處的坐標(biāo)即方向d入棧,然后當(dāng)棧不為空時(shí),取出棧頂(即當(dāng)前節(jié)點(diǎn))的數(shù)據(jù)。遍歷當(dāng)前節(jié)點(diǎn)的四個(gè)方向,找到可行的下一個(gè)節(jié)點(diǎn),并將其入棧;如沒(méi)有可行的下一個(gè)節(jié)點(diǎn),則將

    2024年02月13日
    瀏覽(19)
  • 【學(xué)習(xí)筆記】數(shù)據(jù)結(jié)構(gòu)算法文檔(類(lèi)C語(yǔ)言)

    1.1.1 線(xiàn)性表的順序存儲(chǔ)表示 1.1.2 順序表中基本操作的實(shí)現(xiàn) 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 刪除 1.1.2.6 計(jì)數(shù) 1.2.1 單鏈表的定義和表示 ★ 關(guān)于結(jié)點(diǎn) 1.2.2 單鏈表基本操作的實(shí)現(xiàn) 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 刪除 1.2.2.6 前插法創(chuàng)建單

    2024年02月07日
    瀏覽(53)
  • 【Python數(shù)據(jù)結(jié)構(gòu)與算法】--- 遞歸算法的應(yīng)用 ---[烏龜走迷宮] |人工智能|探索掃地機(jī)器人工作原理

    【Python數(shù)據(jù)結(jié)構(gòu)與算法】--- 遞歸算法的應(yīng)用 ---[烏龜走迷宮] |人工智能|探索掃地機(jī)器人工作原理

    ??個(gè)人主頁(yè):?Aileen_0v0 ??系列專(zhuān)欄:PYTHON數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)系列專(zhuān)欄 ??\\\"沒(méi)有羅馬,那就自己創(chuàng)造羅馬~\\\"? 目錄 導(dǎo)言? 解決過(guò)程? 1.建立數(shù)據(jù)結(jié)構(gòu) 2.探索迷宮: 算法思路 遞歸調(diào)用的“基本結(jié)束條件” 3.烏龜走迷宮的實(shí)現(xiàn)代碼: 運(yùn)行過(guò)程: 拓展: ??全文總結(jié): ?烏龜探索迷宮這個(gè)問(wèn)

    2024年02月05日
    瀏覽(29)
  • 《數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用C++語(yǔ)言描述》-列車(chē)車(chē)廂重排問(wèn)題

    《數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用C++語(yǔ)言描述》-列車(chē)車(chē)廂重排問(wèn)題

    完整可編譯運(yùn)行代碼見(jiàn):Github::Data-Structures-Algorithms-and-Applications/_10Train_carriages_rearrangement/ 一列貨運(yùn)列車(chē)有 n 節(jié)車(chē)廂,每節(jié)車(chē)廂要停靠在不同的車(chē)站。假設(shè) n個(gè)車(chē)站從 1 到n 編號(hào),而且貨運(yùn)列車(chē)按照從n到1的順序經(jīng)過(guò)車(chē)站。車(chē)廂的編號(hào)與它們要停靠的車(chē)站編號(hào)相同。為了便于從

    2024年04月10日
    瀏覽(30)
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)——圖的最短路徑算法解決實(shí)例問(wèn)題

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)——圖的最短路徑算法解決實(shí)例問(wèn)題

    一、問(wèn)題描述 W公司在某個(gè)地區(qū)有6個(gè)產(chǎn)品銷(xiāo)售點(diǎn),現(xiàn)根據(jù)業(yè)務(wù)需要打算在其中某個(gè)銷(xiāo)售點(diǎn)上建立一個(gè)中心倉(cāng)庫(kù),負(fù)責(zé)向其他銷(xiāo)售點(diǎn)提供產(chǎn)品。由于運(yùn)輸線(xiàn)路不同,運(yùn)輸費(fèi)用也不同。假定每天需要向每個(gè)銷(xiāo)售點(diǎn)運(yùn)輸一次產(chǎn)品,那么應(yīng)將中心倉(cāng)庫(kù)建在哪個(gè)銷(xiāo)售點(diǎn)上,才能使運(yùn)輸費(fèi)

    2024年02月08日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    數(shù)據(jù)結(jié)構(gòu)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    最短路徑的算法有兩個(gè), Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解決的是 單源 最短路徑問(wèn)題 。 Floyd算法解決的是 多源 最短路徑問(wèn)題,并且可以處理負(fù)權(quán)圖 。 今天要講的就是Dijkstra算法。 加: feng--Insist (大寫(xiě)的i),進(jìn)java交流群討論互聯(lián)網(wǎng)+技術(shù)??伤饕狿PT等資料。 其他資料

    2024年02月11日
    瀏覽(95)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包