poj-1321

1321:棋盤問題

時間限制: 
1000ms 
內存限制: 
65536kB
描述
在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。
輸入
輸入含有多組測試數據。
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當爲-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多餘的空白行或者空白列)。
輸出
對於每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)。
樣例輸入
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
樣例輸出
2
1
  • 網址:
http://poj.grids.cn/practice/1321/
  • *******************************************
  • 代碼:
#include<stdio.h>  
char s[10][10];  
int aa[10],sum;  
int n,m;  
void dfs(int a,int b)  
{  
    int i;  
    if(b>m)return;  
    if(a==n)  
    {  
        if(b==m)  
        sum++;  
        return;  
    }  
    for(i=0;i<n;i++)  
    {  
        if(aa[i]==1||s[a][i]=='.')continue;  
        else{  
            aa[i]=1;  
            dfs(a+1,b+1);  
            aa[i]=0;  
        }  
    }  
    dfs(a+1,b);  
}  
int main()  
{  
    int i;  
    while(scanf("%d%d",&n,&m),n!=-1||m!=-1)  
    {  
        for(i=0;i<n;i++)  
        scanf("%s",s[i]);  
        sum=0;
		dfs(0,0);  
        printf("%d\n",sum);  
    }     
    return 0;  
}  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章