遞迴求解八皇后問題

2021-10-14 13:04:36 字數 1573 閱讀 3538

題目:

八皇后問題

在8*8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法

遞迴思路:在第1行安全位置放乙個棋子,在第2行安全位置放乙個棋子,以此類推,直到八行都放了棋子,第9行時退出遞迴過程。

c++**:

//八皇后問題

//在8*8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法

//思路:在第1行安全位置放乙個棋子,在第2行安全位置放乙個棋子,以此類推,直到八行都放了棋子,第9行時退出遞迴過程

#include

using

namespace std;

#define num 8

int count =0;

//記錄擺法個數

intnotdanger

(int r,

int l,

int chess[num]

[num]

)//判斷第r+1行、第l+1列的位置是不是安全位置

}//判斷左上方

for(i = r -

1, j = l -

1; i >=

0&& j >=

0; i--

, j--)}

//判斷右下方

for(i = r +

1, j = l +

1; i < num && j < num; i++

, j++)}

//判斷左下方

for(i = r +

1, j = l -

1; i < num && j >=

0; i++

, j--)}

//判斷右上方

for(i = r -

1, j = l +

1; i >=

0&& j < num; i--

, j++)}

if(flag ==1)

else

return1;

}//引數row表示起始行,當前擺放的行編號

//引數line表示總列數

//引數chess表示棋盤

void

eightqueen

(int row,

int line,

int chess[num]

[num])}

if(row == num)

//起始行是第9行時,擺放結束,列印出結果

cout << endl;

} count++;}

else

chess2[row]

[j]=1;

//僅chess[row][j]位置=1

eightqueen

(row +

1, line, chess2);}

}}}int

main()

}eightqueen(0

, num, chess)

;system

("pause");

return0;

}

八皇后問題 遞迴求解

八皇后問題簡述 在西洋棋中,皇后是最厲害的 這也就是大概為什麼不要得罪女人的原因 她可以吃掉任意與其所在列和行,以及對角線上的棋子。所以在8x8的棋盤上,安放8個皇后,使得不會相互攻擊,也就是安全的就變得極為重要。本文採用遞迴的方式,輸出所有的92種可能的方法。如下 include stdafx.h...

八皇后問題 遞迴求解

在西洋棋的棋盤上,按照西洋棋的規則,擺放8個皇后,使之 和平共處 如圖所示,在3 d上有乙個皇后,則綠色區域中都不能再放置皇后了。最暴力的方法就是使用八個for,但是很明顯,這種方法效率太低。對於放置了皇后的位置,仔細觀察棋盤可以發現每一列 行 只能有乙個皇后,每乙個主 次 對角線上也只能有乙個皇后...

八皇后問題的遞迴求解

1.引子 中國有一句古話,叫做 不撞南牆不回頭 生動的說明了乙個人的固執,有點貶義,但是在軟體程式設計中,這種思路確是一種解決問題最簡單的演算法,它通過一種類似於蠻幹的思路,一步一步地往前走,每走一步都更靠近目標結果一些,直到遇到障礙物,我們才考慮往回走。然後再繼續嘗試向前。通過這樣的波浪式前進方法...