POJ1321 棋盤擺放問題(DFS)

2021-08-15 17:19:40 字數 592 閱讀 2285

每日打卡(1/2)  

題目大意:

給你乙個n*n的棋盤,其中只有標#的格仔能放棋子,且兩個棋子不能位於棋盤的同一行或同一列,要求擺k個棋子,求方案數。

大致思路:

裸dfs,和n皇后思路相同。以行數作為基準,如果當前列有符合要求的格仔,可以採取放或不放兩種方法,最後求和。

#include#include#include#include#include#includeusing namespace std;

const int maxn = 10;

int n,k,a[maxn][maxn];

long long ans;

bool vis[maxn];

void dfs(int x,int tot)

else

dfs(0,0);

cout《這個解法會tle,這時候我們可以考慮剪枝。

不難想到,如果總共有5行,當前已經搜到了第4行,卻還有3個棋子沒有擺,那麼這種情況就可以剪枝掉。

if(k-tot>n-x) return;

如果剩下的棋子超過剩下的行數,那麼就剪枝掉。

所以就ac了。

POJ 1321 棋盤問題

time limit 1000ms memory limit 10000k total submissions 7007 accepted 3390 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列...

poj 1321 棋盤問題

棋盤問題 time limit 1000ms memory limit 10000k total submissions 15365 accepted 7600 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一...

POJ 1321 棋盤問題

找到第乙個有 的行開始回溯就可以了 include include using namespace std const int maxn 9 char board maxn maxn bool c maxn int ans,n,k void backtracking int curi,int cnt...