1. 程式人生 > >2014秋C++第19周 補充程式碼 回溯法走迷宮

2014秋C++第19周 補充程式碼 回溯法走迷宮

課程主頁在http://blog.csdn.net/sxhelijian/article/details/39152703,課程資源在雲學堂“賀老師課堂”同步展示,使用的帳號請到課程主頁中檢視。 

問題:


參考程式碼:

#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;

#define MaxSize 100
int maze[10][10] =   //定義一個迷宮,0表示通道,1表示牆
{
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,1,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};

struct Try //定義一個棧,儲存路徑
{
    int i;               //當前方塊的行號
    int j;               //當前廣場的列號
    int d;              //di是下一可走方位的方位號
} path[MaxSize];         //定義棧

int top = -1;            //初始化棧指標

void findPath(int xb, int yb, int xe, int ye)            //路徑為從(xb,yb)到(xe,ye)
{
    int i, j, d, find, k;
    top++;                                             //初始方塊進棧
    path[top].i = xb;
    path[top].j = yb;
    path[top].d = -1;
    maze[xb][yb] = -1;
    while(top>-1)                                      //棧不為空時迴圈
    {
        i = path[top].i;
        j = path[top].j;
        d = path[top].d;
        if(i==xe && j==ye)                             //找到了出口,輸出路徑
        {
            cout << "迷宮路徑如下:\n";
            for(k=0; k<=top; k++)
            {
                cout << "\t(" << path[k].i << "," << path[k].j << ")";
                if((k+1)%5==0) cout << endl;            //每輸出五個方塊後換一行
            }
            cout << endl;
            return;
        }
        find = 0;
        while(d<4 && find==0)                          //找下一個可走的點
        {
            d++;
            switch(d)
            {
            case 0:  //向上
                i = path[top].i-1;
                j = path[top].j;
                break;
            case 1: //向右
                i = path[top].i;
                j = path[top].j+1;
                break;
            case 2:  //向下
                i = path[top].i+1;
                j = path[top].j;
                break;
            case 3:  //向左
                i = path[top].i;
                j = path[top].j-1;
                break;
            }
            if(maze[i][j]==0) find = 1;                      //找到通路
        }
        if(find==1)                                        //找到了下一個可走方塊
        {
            path[top].d = d;                               //修改原棧頂元素的d值
            top++;                                         //下一個可走方塊進棧
            path[top].i = i;
            path[top].j = j;
            path[top].d = -1;
            maze[i][j] = -1;                                 //避免重複走到這個方塊
            //cout << "\t(" << path[top].i << "," << path[top].j << ")"; //顯示經過的試探
        }
        else  //沒有路可走,則退棧
        {
            maze[path[top].i][path[top].j] = 0;                  //讓該位置變成其它路徑可走方塊
            top--;
        }
    }
    cout << "沒有可走路徑!\n";
}

int main()
{
    findPath(1,1,8,8);  //從(1,1)入,(8,8)出
    return 0;
}


=================== 迂者 賀利堅 CSDN部落格專欄=================
|== IT學子成長指導專欄 專欄文章的分類目錄(不定期更新) ==|
|== C++ 課堂線上專欄  賀利堅課程教學連結(分課程年級) ==|
|== 我寫的書——《逆襲大學——傳給IT學子的正能量》    ==|
===== 為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====

相關推薦

2014C++19 補充程式碼 回溯迷宮

課程主頁在http://blog.csdn.net/sxhelijian/article/details/39152703,課程資源在雲學堂“賀老師課堂”同步展示,使用的帳號請到課程主頁中檢視。 問題:參考程式碼:#include <iostream> #incl

2014C++ 8項目 分支程序設計

解法 cas 關系表達式 com 人月 bre 不定 cor 決定 課程主頁在http://blog.csdn.net/sxhelijian/article/details/39152703。課程資源在雲學堂“賀老師課堂”同步展示,使用的帳號請到課程主頁中查看。閱讀並驗證

201719

解決 解決問題 技術 方案 時間 研發 產品 長時間 能力 晚上睡前,忙碌的一天,雖然坎坷艱辛但最終總算完成了該做的事,雖是簡單的事花了很長時間,但艱辛之後感覺收獲頗豐。同一公司的人有的加班多忙的要死,有的不怎麽加班,輕松自在,雖然短時間看資源會分配不均勻,但長期看應該會好

201719

努力 提醒 ont 驗證 line 奮鬥 未來 eight 接下來 不想加班的晚上又搞到了現在,難道是習慣了。今天的結果是既喜又憂,現場緊急的問題算搞完了,但自己測試驗證理解原理的問題卻沒多個進展,難道非要別人催著才能前進?接下來的兩天最主要的是別犯錯,不出萬一的小概率事件

201719

愛的 整合 安全 理解 童年 感到 自己 交流 地理 責任和權力對等,但往往人想要權力不願擔責任,擔責任難免委屈,當感覺自己付出跟收獲不成比例時也很委屈,所以馬雲才說男人的胸懷是委屈撐大的。不要只看人好的一面,而不知道別人的付出。1、 沒有所謂玩笑,所有的玩笑都有認真的成分

2013級C++12(春)項目——成員的訪問屬性、多重繼承

更新 日期 報告 時間 上下 cin out 讀取 edate 課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759,內有完整教學方案及資源鏈接第一部分 程序閱讀 1、閱讀程序。分析類中成員的訪問屬性

2015級C++7項目 友元、共享數據保護、多文件結構

執行 pub 程序 block tails 一個 date類 能夠 tracking 【項目1-成員函數、友元函數和一般函數有差別】參考解答   (1)閱讀以下的程序,體會凝視中的說明(要執行程序,請找到課程主頁並復制代碼) //例:使用成員函數、友

2013-C++15專案參考解答連結集

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++7任務3-輸出星號圖詳解示例

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++15專案3 -約瑟夫環

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++11專案2(1)參考——百錢百雞

                【專案2:窮舉法解決組合問題】先閱讀例題,領會窮舉法(意為“窮盡式列舉”,也稱列舉)的思想,然後自行選題進行解決,掌握這種程式設計的一般方法。任務:利用窮舉的方法解決下面的問題(選做一道即算完成任務,其他可以抽時間自由安排,多做會使你更聰明。)(1)百錢百雞問題:中國古代數學家

C#--2實驗--任務14--隨機給出一個0至99(包括0和99)之間的數字,然後讓你猜是什麼數字。

/* (程式頭部註釋開始)* 程式的版權和版本宣告部分* Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved.* 檔名稱:隨機給出一個0至99(包括0和99)之間的數字,然後讓你猜是什麼數字。你可以隨便猜一個數字,遊戲

C++實驗報告3-1》----接8任務3,定義分數類中運算子過載,實現分數的輸入輸出

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: CFraction.cpp *

C#--2實驗--任務2(1)--使用者輸入一個字元,並用Console類的Readkey()方法讀取該字元,並在控制檯上輸出該字元

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱:建立一個控制檯應用--使用者輸入一個字元,並用Console類的Readkey()方法讀

C++11mooc線上測評—11 類的繼承

//1公有繼承中派生類Student對基類Person成員的訪問(20分) //題目內容: //已知基類Person的定義如下: //class Person //{ // char Name[20]; // char Sex; // int // Age; //publ

C#--11實驗--任務1(建立Windows窗體應用程式)--設計一個窗體--單擊按鈕時,在標籤上顯示當前系統時間 .

/* (程式頭部註釋開始)    * 程式的版權和版本宣告部分    * Copyright (c) 2011, 煙臺大學計算機學院學生     * All rights reserved.    * 檔名稱:設計一個窗體   * 版 本 號: V1.0     * 對任務

2013級C++12程式閱讀專案——理解函式

課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759第一部分 重重重要的技能:掌握單步執行,跟蹤觀察執行中變數的變化今後在除錯程式時,儘可能利用好除錯功能,這是職業的要求。第二部分 閱讀程式碼,理解函式的

C++6專案1

【題目】下面的程式存在編譯錯誤。有兩種方法可以修改,請給出這兩種修改方案,在報告中說明你傾向於用哪一種?為什麼?處理此類問題的原則是什麼?class C {private: int x; public: C(int x){this->x= x;}

2015級C++2實踐專案

【專案1 - 宣告“主權”】   你已經是CSDN部落格主了,用IT人特有的方式,編一段程式,在螢幕上輸出你想說的話,按要求釋出博文,作為我們的開山之作。 【專案2 - 胖子不想說體重】參考解答   成年男性的標準體重公式為: 標準體重(kg)=身高(c

C#--12實驗--任務2(設計一個窗體)--開啟對話方塊

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱:訊息對話方塊 * 作 者: 雷恆鑫 * 完成日期: 2