1. 程式人生 > >回溯法解迷宮問題的兩個解法

回溯法解迷宮問題的兩個解法

{
        
if(i==1&&j==2){
            
int t=1;
        }
;
        
if(i==4&&j==4){                        //已經找到終點,列印結果
            printf("Finish! The path is: ");
            
for(count=0;count<top;count++){
                printf(
"(");
                printf(
"%d",stack[count].row);
                printf(
",");
                printf(
"%d",stack[count].col);
                printf(
"");
            }

            printf(
"(4,4)");
            
break;
        }

        
if( direction[1]==0
            
&& i>0
            
&&*(*(maze+i-1)+j)==0 ){        //上方向的下一個位置不越界而且可以通過
                stack[top].row
=i;
                stack[top].col
=j;
                direction[
1]=1;
                
for(count=1;count<=4;count++){
                    stack[top].direction[count]
=direction[count];
                    direction[count]
=0;        //使下一個位置方向狀態初始化
                }

                direction[
3]=1;                
//更新下一個位置:使朝向原位置的方向標識置1
                top++;                        //進棧
                direction[3]=1;
                i
--;
        }

        
elseif( direction[2]==0
                 
&& j>0
                 
&&*(*(maze+i)+j-1)==0 ){    //左方向的下一個位置不越界而且可以通過
                stack[top].row=i;
                stack[top].col
=j;
                direction[
2]=1;
                
for(count=1;count<=4;count++){
                    stack[top].direction[count]
=direction[count];
                    direction[count]
=0;        //使下一個位置方向狀態初始化
                }

                direction[
4]=1;                //更新下一個位置:使朝向原位置的方向標識置1
                top++;                        //進棧
                j--;
        }

        
elseif( direction[3]==0
                 
&& i<4
                 
&&*(*(maze+i+1)+j)==0 ){    //下方向的下一個位置不越界而且可以通過
                stack[top].row=i;
                stack[top].col
=j;
                direction[
3]=1;
                
for(count=1;count<=4;count++){
                    stack[top].direction[count]
=direction[count];
                    direction[count]
=0;        //使下一個位置方向狀態初始化
                }

                direction[
1]=1;                //更新下一個位置:使朝向原位置的方向標識置1
                top++;                        //進棧
                i++;
        }

        
elseif( direction[4]==0
                 
&& j<4
                 
&&*(*(maze+i)+j+1)==0 ){    //右方向的下一個位置不越界而且可以通過
                stack[top].row=i;
                stack[top].col
=j;
                direction[
4]=1;
                
for(count=1;count<=4;count++){
                    stack[top].direction[count]
=direction[count];
                    direction[count]
=0;        //使下一個位置方向狀態初始化
                }

                direction[
2]=1;                //更新下一個位置:使朝向原位置的方向標識置1
                top++;                        //進棧
                j++;
        }
else{                                //已經沒有別的路了,只有回頭
if(top==0){
                printf(
"No path!");
                
break;
            }

                
*(*(maze+i)+j)=1;            //在回頭前標識當前路為不能通過
                top--;                        //出棧
                i=stack[top].row;
                j
=stack[top].col;
                
for(count=1;count<=4;count++)
                    direction[count]
=stack[top].direction[count];
        }

        
//printf("(%d,%d) ",i,j);
    }

相關推薦

回溯迷宮問題的解法

{        if(i==1&&j==2)...{            int t=1;        };        if(i==4&&j==4)...{                        //已經找到終點,列印結果            printf(

1,2,3……,9組成3三位數abc,def和ghi,每個數字恰好使用一次,要求abc:def:ghi=1:2:3.輸出所有解法

解法1:#include<iostream> #include<cstdio> using namespace std; void result(int num

leetcode算題1: 二進制數有多少位不相同?異或、位移、與運算的主場

output 判斷 ++ 輸入 urn ger ria 結果 ret /* The Hamming distance between two integers is the number of positions at which the corresponding bit

總結之 單鏈表相交的一些列問題

找到 開始 兩種 end 相交 說明 移動 一個 返回 單鏈表,可能有環,也可能無環。給定兩個單鏈表的頭節點head1 和 head2 這兩個鏈表可能交也可能不交。實現函數,如果相交,請返回相交的第一個節點,不交返回null 這道題目需要分析的情況非常 本題拆分

:用棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。《劍指offer》

pack 代碼 exception 隊列 imp scrip 入棧 return tro 算法:用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。《劍指offer》 利用棧來進行操作,代碼註釋寫的比較清楚:首先判斷兩個棧是否是空的:

學習之【回溯】--迷宮問題

map print 檢測 tle 要求 -i result color n) 題目描述 定義一個二維數組N*M(其中2<=N<=10;2<=M<=10),如5 × 5數組下所示: int maze[5][5] = { 0, 1, 0

回溯求解迷宮問題

回溯 路徑 style 通路 完全 continue != std 下一個 題目 這是我在老師發的PPT上發現的一道題,如下 1表示起點 7表示終點,一共六個路口,每個路口可以通達最多左上右三個路口,不能走的方向用0表示,求從1到7的路徑。 求解思路:

[回溯] 1 求n元素的集合的冪集

問題 求含n個元素的集合的冪集 【註釋】冪集:所有子集所組成的集合 【舉例】 A={1,2,3} ρ(A) = { {1,2,3}, {1,2}, {1,3}, {1}, {2,3}, {2}, {3}, ∅ } 思路 本問題可以用【分治法】來求解 從另一個角度

在Unity3D中利用描點畫圓——圓融合

這次講述怎麼讓兩個圓融合。 程式碼如下: int Pos_Z = 0; public int N; //半圓取樣點個數 Vector3 CicleCenter1 = new Vector3(-0.3f, 0, 0);//兩個圓圓心 V

二分方程 種函式

//單調函式Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and 100;<br>Now please try you

回溯八皇后問題(JAVA)

這兩天在學習演算法設計,接觸到回溯法,八皇后問題是回溯法裡的經典案列,下面介紹一下本人在半天時間內編寫的JAVA程式,回溯法解八皇后問題。 首先需要認識到回溯法有比較固定的程式框架,即定義一個解空間space , 每一層的元素數目陣列nspace[i],一個解向量陣列sin

【分步詳有序陣列中的中位數和Top K問題

問題介紹 這是個超級超級經典的分治演算法!!這個問題大致是說,如何在給定的兩個有序數組裡面找其中的中值,或者變形問題,如何在2個有序陣列陣列中查詢Top K的值(Top K的問題可以轉換成求第

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

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

c++廣搜迷宮問題(佇列)

1042.電子老鼠闖迷宮 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 有一隻電子老鼠被困在如下圖所示的迷宮中。這是一個12*12單元的正方形迷宮,黑色部分表示建築物,白色部分是路。電子老鼠可以在路上向上、下、左、右行走,每一步走一個格子。現給

【演算法分析】回溯八皇后問題(n皇后問題)

回溯法解題思路: (1)針對所給問題,定義問題的解空間;    (2)確定易於搜尋的解空間結構;    (3)以深度優先方式搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋。 八皇后問題:

回溯迷宮問題

回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足

回溯01揹包問題(C語言版)

/*test.h*/ #include<stdio.h> //-------------巨集定義------------ #define OK 0 //-----------變數宣告-------------- int x[100],bestx[100]; int cv = 0,cw = 0,mw

回溯回溯裝載問題

一、回溯法有“通用的解題法”之稱,可以系統的搜尋一個問題的所有解或任一解。它在問題的解空間中按深度優先策略,從根節點出發,搜尋解空間樹。演算法搜尋至解空間樹的任一節點時,先判斷該節點是否包含問題的解,如果肯定不包含則跳過對以該節點為根的子樹的搜尋,回到其父節點回溯。否則,

[C/C++] 回溯0-1揹包問題

用最小的空間裝最大價值的物品是經典的揹包問題,而0-1揹包是揹包問題中最簡單的情況,常見的做法有動態規劃和回溯法等。本文用更為容易理解的回溯法來解決該問題。我們把每個輸入的物品都看做一個節點,用標記陣列來標記是否使用該物品,於是物品節點之間能夠生成一顆二叉樹,二叉樹節點的左子

01揹包的四種解法:動態規劃,貪心回溯,優先佇列式分支限界(C語言編寫)

最近剛完成了演算法課程設計,題目是用多種解法解決01揹包問題,經過一番探索,終於成功的用四種方法完成了本次實驗,下面記錄分享一下成果: 首先解釋下什麼是01揹包問題:給定一組共n個物品,每種物品都有自己的重量wi, i=1~n和價值vi, i=1~n,在限定的總重量(揹包的