C 藍橋杯 基礎練習之2n皇后

2021-10-03 11:47:21 字數 2794 閱讀 3777

資源限制

時間限制:1.0s 記憶體限制:512.0mb

問題描述

給定乙個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

樣例輸出

樣例輸入4

1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出

思路總體上的思路是學習八皇后思想,首先完成白皇后的八皇后,再白皇后的基礎上完成黑皇后的八皇后情形

對於八皇后棋盤來說:

主對角線共15條,主對角線上的位置滿足y-x相等

副對角線共15條,副對角線上的位置滿足y+x相等

劉汝佳演算法入門經典 p193頁 ,書上還有利用位置關係判斷衝突的方法

0代表未被佔據,1代表佔據

v[0][i] 代表第i列是否被佔據

v[1][i-cur+n]cur代表行號 代表第i-cur+n條主對角線 實際上是和i對應在一起的左上角

v[2][i+cur]代表第i+cur條副對角線,實際上是和i對應的右上角

實際上v的大小滿足v[3][2n-1],2n-1代表的是對角線數

方法就是先獲得白皇后滿足n皇后情況後的棋盤,

然後在此基礎上再去獲得黑皇后滿足條件的全排列

對於初次接觸n皇后的小白來說,需要注意的是:

掌握遞迴列舉/回溯法

n皇后的棋盤列印,可以寫在n==cur後面,因為此時的c[cur]的n個位置都有著對應的皇后

對於本題來說,需要注意的是:

**

#include

#include

#define n 100

using

namespace std;

int n;

int ans=0;

int c[n]

[n];

//c代表輸入棋盤,我覺得用到的地方只有那個不能放棋子的0位置

int wvisit[3]

[n];

// 判斷衝突陣列

int bvisit[3]

[n];

int white[n]

;//whihe[cur]=j 代表的是第cur行的皇后在j的位置

int black[n]

;void

white_dfs

(int);

void

black_dfs

(int);

/*主對角線共15條,主對角線上的位置滿足y-x相等

副對角線共15條,副對角線上的位置滿足y+x相等

劉汝佳演算法入門經典 p193頁 ,書上還有利用位置關係判斷衝突的方法

0代表未被佔據,1代表佔據

v[0][i] 代表第i列是否被佔據

v[1][i-cur+n]cur代表行號 代表第i-cur+n條主對角線 實際上是和i對應在一起的左上角

v[2][i+cur]代表第i+cur條副對角線,實際上是和i對應的右上角

方法就是先獲得白皇后滿足n皇后情況後的棋盤,

然後在此基礎上再去獲得黑皇后滿足條件的全排列

*/void

white_dfs

(int cur)

else

for(

int i=

0;i}void

black_dfs

(int cur)

else

for(

int i=

0;i}int

main()

八皇后

思路

回溯法,每一行有n列可供選擇,當前的行號cur在0-7列的時候,同時也要和前cur行進行比較,比較涉及列、對角衝突,一旦衝突就放棄了,截至遞迴終止的話就進行下一行,如果能到第n行,表明皇后在第cur行在第i列存在可行方案

#include

#include

#define n 20

int n;

int cnt=0;

int lst[n]

;using

namespace std;

void

search

(int cur)

}//如果第cur行的第i列合法,即與前cur行都沒有衝突,flag==1,繼續尋找下一行,等到遞迴迴圈結束,在次基礎上,到下一列進行遞迴

if(flag)

search

(cur+1)

;}}}

intmain()

return0;

}

語法

函式的宣告需要在開始宣告才能確保函式之間的相互呼叫,宣告函式的時候必須宣告引數型別

藍橋杯基礎練習 2n皇后問題

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

藍橋杯 基礎練習 2n皇后問題

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

藍橋杯基礎練習2n皇后問題C語言

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