Description
在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。Input
輸入含有多組測試數據。Output
對於每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)。Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
2 1
一做搜索的題目,就有著開兩個數組dx[],dy[],來進行搜索的定式思維,其實那個就是用來走迷宮的。。
題目要求選擇的棋子不同行,不同列,所以我們可以一行一行的搜索,找到了 # 就直接進入下一行
這樣首先保證了不同行,然後再開一個vis【】數組,用來記錄棋子所在列數,深搜即可。
【源代碼】
#include#include #include using namespace std; int n,k,ans; char map[10][10]; bool vis[10]; void dfs(int cur,int cnt){ if(cnt==k) { ans++; return; } if(cur>n) //如果超過最後一行 return ; for(;cur<=n;cur++) //起點從第一排開始搜 for(int j=1;j<=n;j++){ if(map[cur][j]=='#'&&!vis[j]){ vis[j]=1; dfs(cur+1,cnt+1); vis[j]=false;//回溯 } } } int main(){ while(scanf(%d%d,&n,&k)!=EOF&&n!=-1&&k!=-1){ memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf( %c,&map[i][j]); } ans = 0; dfs(1,0); printf(%d ,ans); } return 0; }