傳送門
在乙個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。
這題和n皇后有點相似,但還是有不同點:
1.n皇后還要求對角線和輔對角線都不能放,需要使用額外陣列去判斷對角線和輔對角線有沒有放過棋子
2.n皇后初始化時每個位置只有一種狀態,而這題初始化時每個位置有'#'和'.',只有'#'才可以放
搜尋的結束條件為:
1.已經放好的棋子數量等於k,方案數加一
2.當前行數等於n,因為從索引為0的行開始找,當前行數等於n,也就說明0~n-1行都遍歷了
在dfs函式的最後面要加上
dfs
(u +
1, cnt)
;
因為有可能在搜尋某一行時,這一行的每個位置都是』.』,也有可能除了』.'外的其他位置所在的列都放了棋子,
如果沒有上面這行**,就有可能無法進到下一行去搜尋
#include
#include
#include
using
namespace std;
//n為棋盤的行數和列數,k為要放的棋子數量,ans為方案數,cnt為已經放了多少個棋子
int n, k, ans, cnt;
//儲存地圖
char g[10]
[10];
//記錄某一列是否已經放了棋子
bool col[10]
;void
dfs(
int u,
int cnt)
//因為從索引為0的行開始找,當u等於n,也就說明0~n-1行都遍歷了
if(u == n)
return
;for
(int i =
0; i < n; i++)}
dfs(u +
1, cnt)
;//注意這行**
}int
main()
}
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...