棋盤問題
Description 在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有差別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對于給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。 Input 輸入含有多組測試資料。 每組資料的第一行是兩個正整數,n k,用一個空格隔開,表示了将在一個n*n的矩陣内描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n 當為-1 -1時表示輸入結束。 随後的n行描述了棋盤的形狀:每行有n個字元,其中 # 表示棋盤區域, . 表示空白區域(資料保證不出現多餘的空白行或者空白列)。 Output 對于每一組資料,給出一行輸出,輸出擺放的方案數目C (資料保證C<2^31)。 Sample Input Sample Output Source 蔡錯@pku |
類似于八皇後。簡單DFS
好像還有DP的解法。。。研究中
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string a[9];
int n,k,i,ii,xx[10];
void dfs(int,int);
int main()
{
while ( cin>>n>>k && n != -1 ){
ii=0;
memset(xx,0,sizeof(xx));
for (i=0;i<n;++i) cin>>a[i];
dfs(0,0);
cout<<ii<<endl;
}
return 0;
}
void dfs(int x,int point){
int i;
if (x<n){
for (i=0;i<n;++i)
if (!xx[i] && '#'==a[x][i])
if(point+1==k) ++ii;
else{
xx[i]=1; a[x][i]='&';
dfs(x+1,point+1);
xx[i]=0; a[x][i]='#';
}
if (n>k) dfs(x+1,point);
}
return;
}
kdwycz的網站: http://kdwycz.com/
kdwyz的刷題空間:http://blog.csdn.net/kdwycz