[
回溯法
_八皇后
]堆疊實現的非遞迴版本
by emilmatthew
05/11/9
其實,
用遞迴或
while
迴圈實現
n皇后問題效果挺好的
(請參考
),而且思路也很清楚
,為什麼還要去多加乙個棧呢
?原因在於
,為了更好的訓練演算法及資料結構的應用
,達到融會貫通的目的
.做些遞迴與非遞迴程式間的轉換是起碼的要求
.(水平菜就得這樣來
)演算法陳述
:用乙個陣列
arr來表示皇后在行間或位置
depth
表示下一步探索的深度
stack
作為上層跳轉下來時上層位置的中間紀錄
.*size
表示問題的規模
.nqueensproblem stack version
壓首行首列元素0進棧
.depth置1
doelse if
這個位置有衝突並且
i已超出問題
規模else
當前位置沒有衝突}}
}下面給出演算法的
c程式實現
:void nqueensproblemstack(int size,file* outputfile)
else
else
else//no collide,branching to next level}}
}printf("/ndepth%d/n",depth);
if(flag==1)
printf("resolve successfully/n");
else
printf("no resolve/n");
}/*aid fun*/
int checkxiepos(int r1,int r2,int c1,int c2)
int checkvpos(int* arr,int len)
return flag;
}int partfinished(int* arr,int len)
out:
return flag;
}
回溯法 八皇后問題(非遞迴)
回溯法 試探法 八皇后問題 非遞迴 列印一組解 includeint col 8 int left 15 int right 15 int q 8 void queen void if j 8 int main else printf n return 0 n皇后問題 列印第一組解 include ...
回溯法 八皇后問題的遞迴與非遞迴演算法
八皇后的問題非常有名,初次理解可能稍有難度,不過多看書,看部落格和 幾遍下來,也基本清晰。首先不用想初始的情況,先假設前面已經排列好了幾個皇后,即將排列下乙個皇后。依次遍歷八個位置,然後與之前的進行判斷這個位置是否可行,如可行則進行下乙個皇后,否則則移動位置繼續判斷。很簡單。但是有兩個個問題 1 不...
八皇后問題 回溯 遞迴 回溯 非遞迴
八皇后問題 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 我們可以嘗試在將第乙個皇后擺放在第0行第0列,為了不衝突,將第二個皇后擺放在第1行第3列 依次下去 然後發現第5行每個位置都有衝突,這說明上面4行肯定不能這麼擺放...