A-POJ-1321盤問題

3377 ワード

Descriptionは、指定された形状の碁盤(形状が不規則である可能性がある)の上に駒を並べ、駒に違いはありません.任意の2つの駒を碁盤の中の同じ行または同じ列に置くことができないことを要求する場合は、所定の形状と大きさの碁盤に対して、k個の駒を置くすべての実行可能な配置スキームCをプログラミングして解いてください.
Input入力には複数のテストデータが含まれています.各グループのデータの最初の行は2つの正の整数、n、kであり、1つのスペースで区切られ、1つのn*nのマトリクス内に碁盤を記述し、駒を置く数を示す.n<=8,k<=nは−1−1で入力終了を示す.次のn行は、各行にn文字を有する碁盤の形状を示す.空白領域を表します(データは余分な空白行や空白列が現れないことを保証します).
Outputは、各セットのデータに対して、1行の出力を与え、配置されたシナリオ数Cを出力する(データ保証C<2^31).
Sample Input 2 1 #. .# 4 4 …# ..#. .#.. #… -1 -1
Sample Output 2 1
DFSでいい、#は駒を置くことができる場所で、無視します.空白にすればいい.
#include
#include
int n,k,ans,e;
int lie[9];
char map[9][9];
void DFS(int i){
    if(e==k){
        ans++;
        return;
    }
    if(i>=n+1)
        return;
    for(int j=1;j<=n;j++){
        if(!lie[j]&&map[i][j]=='#'){
            lie[j]=1;
            e++;
            DFS(i+1);
            lie[j]=0;
            e--;
        }
    }
    DFS(i+1);
}
int main(){
    int i,j;
    while(scanf("%d%d",&n,&k)!=EOF){
        getchar();
        if(n==-1&&k==-1)
            break;
        memset(lie,0,sizeof(lie));
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                scanf("%c",&map[i][j]);
            }
            getchar();//    ,          
        }
        e=0;
        ans=0;
        DFS(1);
        printf("%d
"
,ans); } return 0; }

書くときは2つの点に注意していません.1つは、リターンが配列に読み込まれるのではなく、自分で定義したのはグローバル変数のデータのセットが計算された後にゼロに戻らず、ずっとwaになって、多くの時間を浪費しています.