POJ1321——棋盤問題(DFS)
阿新 • • 發佈:2020-09-23
@
目錄POJ1321棋盤問題
題目
http://poj.org/problem?id=1321
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 99960 Accepted: 45560 Description 在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。 Input 輸入含有多組測試資料。 每組資料的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n 當為-1 -1時表示輸入結束。 隨後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。 Output 對於每一組資料,給出一行輸出,輸出擺放的方案數目C (資料保證C<2^31)。 Sample Input 2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1 Sample Output 2 1 Source 蔡錯@pku
思想
DFS
程式碼
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std; char map[10][10]; bool visit[100]; int n,k; int cnt; int path;//當前路徑到達層數(行數) void dfs(int row){ if(path == k){ cnt++; return ; } if(row >= n){ return ; } for(int i = 0; i < n; i++){ if(!visit[i] && map[row][i] == '#'){//第level行第i列 visit[i] = true; path++; dfs(row + 1); visit[i] = false; path--; } } dfs(row + 1); } int main(){ while(scanf("%d%d", &n,&k)){ if(n==-1&&k==-1) break ; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ // scanf("%d", &map[i][j]); cin>>map[i][j]; } cnt = 0; path = 0; memset(visit, false, sizeof(visit)); dfs(0); printf("%d\n",cnt); } return 0; }