回溯法解迷宮問題的兩個解法
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("%d",stack[count].col);
printf(") ");
}
printf("(4,4)");
break;
}
if( direction[1]==0
&& i>0
&&*(*(maze+i-1)+j)==0 ){ //上方向的下一個位置不越界而且可以通過
stack[top].row
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;
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,在限定的總重量(揹包的