POJ——1321【dfs+回溯】棋盤問題
阿新 • • 發佈:2018-11-10
【思考】:
中文題題意很清晰,就是在給定的棋盤上下棋,問你怎麼有多少種不同的下法。dfs固定每一行,找列中可以下的點,然後返回就行。
在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放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
ac程式碼:
#include<cstdio> #include<cstring> using namespace std; int n,k,ans; char s[10][10]; int vis[200]; void dfs(int x,int cot)//cot是下的棋子數 { if(cot==k){ ans++; return ; } for(int i=x;i<=n;++i){ for(int j=0;j<n;j++){ if(s[i][j]=='#'&&!vis[j]){ //在列中找可以下棋的地方 vis[j]=1; dfs(i+1,cot+1); vis[j]=0; } } } } int main() { while(scanf("%d%d",&n,&k)!=EOF) { if(n==-1&&k==-1) break; memset(vis,0,sizeof(vis)); memset(s,0,sizeof(s)); for(int i=1;i<=n;i++) scanf("%s",s[i]); ans=0; dfs(1,0); printf("%d\n",ans); } return 0; }