poj1321
棋盤問題
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13480 | Accepted: 6667 |
Description
在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。
Input
輸入含有多組測試數據。
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨后的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。
每組數據的第一行是兩個正整數,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
漢語題,喜歡……
這題顯然是dfs,但是要注意避免重復情況
即選擇往后面的行搜索下一個棋子擺放位置,如果往前的話會出現重復
還有一個小優化 如果剩余行數+當前sum<k說明不可能再搜索到解,直接退出就行
1#include<stdio.h>
2#include<string.h>
3#include<math.h>
4short mark[9][9],b[9];
5char map[9][9];
6int n,i,j,k,ans,sum;
7void dfs(int x,int y)
8{
9int i,j;
10if (sum==k)
11{
12ans++;
13return;
14}
15if (sum+n-x<k) return;
16b[y]=1;
17for (i=x+1;i<=n ;i++ )
18{
19for (j=1;j<=n ;j++ )
20{
21if ((!b[j])&&(mark[i][j]==1))
22{
23sum++;
24dfs(i,j);
25sum--;
26}
27}
28}
29b[y]=0;
30}
31int main()
32{
33while (scanf("%d%d",&n,&k)!=EOF&&(!(n==-1&&k==-1)))
34{
35memset(mark,0,sizeof(mark));
36for (i=1; i<=n ; i++ )
37{
38scanf("%s",&map[i]);
39for (j=1; j<=n; j++)
40if (map[i][j-1]=='#')
41mark[i][j]=1;
42}
43ans=0;
44memset(b,0,sizeof(b));
45for (i=1;i<=n ;i++ )
46{
47for (j=1;j<=n;j++)
48if (mark[i][j]==1)
49{
50sum=1;
51dfs(i,j);
52}
53}
54printf("%d\n",ans);
55}
56return 0;
57}
58