棋盤問題POJ 1321

2021-10-11 21:36:29 字數 1112 閱讀 8532

題意:給定兩個數n,k。分別表示棋盤的大小(可能不規則)和要放的棋子,要求棋盤的每行每列僅能放乙個棋子,求每個樣例擺放的可能性。多組樣例輸入。

輸入:對於每個樣例有n行n列

#表示可以放棋子

.表示不能放

k==-1&&n==-1時結束輸入。

sampe input

2 1#.

.#4 4

…#…#.

.#…#…

-1 -1

sample output21

思路:一般想找規律,發現找不到~~

典型的dfs題注意回溯的寫法

ac**

#include

using

namespace std;

int board[10]

[10];

//0表示不能放棋子 1表示可以 2表示已經放了棋子

int n,k;

long

long cnt;

bool

vis(

int row,

int column)

//判斷該位置是否可以放棋子

/* 第乙個變數row的設定目的是按序搜尋以避免答案重複 第二個變數step是為了記錄已經放置了幾顆棋子,當放了k個就結束搜尋,答案++*/

void

dfs(

int row,

int step)

else}}

}return;}

intmain()

else}}

dfs(1,

0);printf

("%lld\n"

,cnt)

; cnt=0;

}return0;

}

自己的想法

dfs一般都是通過遞迴實現的吧~~

回溯:深度優先搜尋中實現某節點深度搜尋後(一條深度路徑的遍歷),返回最初出發的節點。且在返回最初出發節點後一般要消除上次,搜尋帶來的影響。

在此題中表現在dfs(i+1,step+1);回溯結束;

board[i][j]= 1;消除上次搜尋的影響。

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...