藍橋杯 帶限制的八皇后問題(王 後傳說)遞迴解法

2021-10-02 05:23:59 字數 1975 閱讀 6764

地球人都知道,在西洋棋中,後如同太陽,光芒四射,威風八面,它能控制橫、堅、斜線位置。

看過清宮戲的中國人都知道,後宮乃步步驚心的險惡之地。各皇后都有自己的勢力範圍,但也總能找到相安無事的辦法。

所有中國人都知道,皇權神聖,伴君如伴虎,觸龍顏者死…

現在有乙個n*n的皇宮,國王佔據他所在位置及周圍的共9個格仔,這些格仔皇后不能使用(如果國王在王宮的邊上,占用的格仔可能不到9個)。當然,皇后也不會攻擊國王。

現在知道了國王的位置(x,y)(國王位於第x行第y列,x,y的起始行和列為1),請問,有多少種方案放置n個皇后,使她們不能互相攻擊。

輸入格式

一行,三個整數,皇宮的規模及表示國王的位置

輸出格式

乙個整數,表示放置n個皇后的方案數

樣例輸入

8 2 2

樣例輸出

資料規模和約定

n<=12

其實很簡單,就是帶限制的n皇后問題,只要在初始化時在陣列中置為,在遞迴的時加候判斷條件就可以了

#include

#include

using

namespace std;

#define maxlen 14

#define empty 0

#define queen 4

#define kind 5

int a[maxlen]

[maxlen]

;int n, x, y;

int cnt =0;

intcan

(int posx,

int posy)

// 右下

int f1 =1;

i = posx;

j = posy;

while(1

<=i && i<=n &&

1<=j && j<=n)

}// 右上

int f2 =1;

i = posx;

j = posy;

while(1

<=i && i<=n &&

1<=j && j<=n)

}// 左下

int f3 =1;

i = posx;

j = posy;

while(1

<=i && i<=n &&

1<=j && j<=n)

}// 左上

int f4 =1;

i = posx;

j = posy;

while(1

<=i && i<=n &&

1<=j && j<=n)

}// 上

int f5 =1;

i = posx;

j = posy;

while(1

<=i && i<=n)

}// 下

int f6 =1;

i = posx;

j = posy;

while(1

<=i && i<=n)

}// 左

int f7 =1;

i = posx;

j = posy;

while(1

<=j && j<=n)

}// 右

int f8 =1;

i = posx;

j = posy;

while(1

<=j && j<=n)

}int f = f1 * f2 * f3 * f4 * f5 * f6 * f7 * f8;

if(f)

else

}void

dfs(

int row)

else}}

}int

main()

}}dfs(1)

; cout

}

藍橋杯 遞迴回溯 八皇后問題 N皇后問題

大致思路 其實就是三個功能函式 place attack output solution place函式中的任務就是把所有的 設為有maxqueen個 皇后的列位置安頓好。其傳入的引數僅乙個,為皇后的序數q,然後經過i從1 maxqueen的遍歷找到該序數q的皇后應在的列數號,使queen q i,...

藍橋杯 超級瑪麗(帶限制的走樓梯問題)遞迴解法

大家都知道 超級瑪麗 是乙個很善於跳躍的探險家,他的拿手好戲是跳躍,但它一次只能向前跳一步或兩步。有一次,他要經過一條長為n的羊腸小道,小道中有m個陷阱,這些陷阱都位於整數字置,分別是a1,a2,am,陷入其中則必死無疑。顯然,如果有兩個挨著的陷阱,則瑪麗是無論如何也跳過不去的。現在給出小道的長度n...

藍橋杯 特殊回文數(帶限制的全排列)遞迴解法

123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入一行,包含乙個正整數n。按從小到大的順序輸出滿足條件的整數,每個整數佔一行。1 n 54。include using namespace std in...