八皇后問題 2n皇后問題

2021-08-17 05:01:16 字數 1214 閱讀 1315

問題描述:在8*8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行、同一列或同一斜線上。

解決思路:解決八皇后問題不難,主要是應用到了遞迴回溯的方法,本質上也是一種列舉法。從棋盤的第一行開始嘗試擺放第乙個皇后,擺放成功之後,遞迴一層,再遵循規則在棋盤第二行來擺放第二個皇后。如果當前位置無法擺放,則向右移動一格再次嘗試,如果擺放成功後則繼續遞迴下一層,擺放第三個皇后,以此類推……如果某一層看遍了所有格仔都無法成功擺放,則回溯到上一皇后,讓上一皇后向右移動一格,再進行遞迴。如果八個皇后都擺放完畢且符合規則,那麼就得到了其中一種正確的解法。

具體**如下:

public class eightqueen 

}class queen8

if(x+1+i < max && chessboard[x+1+i][y-1-i] == 1)

}return true;

}boolean settle(int y)

//遍歷當前行,逐一格仔檢查

for(int i = 0;i

從八皇后問題引申到2n皇后的問題,也就是藍橋杯歷屆試題中的2n皇后問題,具體問題是:

給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。

輸入格式

輸入的第一行為乙個整數n,表示棋盤的大小。

接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。

輸出格式

輸出乙個整數,表示總共有多少種放法。

樣例輸入 4

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出 2

樣例輸入 4

1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出 0

一樣的思想,只不過2n皇后問題更加的複雜化,所考慮的條件也更加複雜起來。

具體實現**:

#include int go(int* a, int* b, int* c, int m, int n)}}

}return count;

}int main()

八皇后 n皇后 2n皇后

n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n n 個黑皇后和 n n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n n 小於等於 88。輸入的第一行為乙個整數 n n,表示棋盤的大...

從八皇后問題到2n皇后問題

八皇后問題 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 方法 遞迴 回溯 include using namespace std int queen 9 表示每一行皇后的位置,如 queen 2 4,表示第2列第4行有乙個皇...

n皇后與2n皇后問題

題目 在n n格的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於再n n的棋盤上放置n個皇后,任何2個皇后不妨在同一行或同一列或同一斜線上。給定棋盤的大小n n 13 輸出整數表示有多少種放置方法 n 8是時輸出92 incl...