POJ1321棋盤問題(DFS)

nupt_twoFish發表於2018-03-19
#include<iostream>
using namespace std;
#define maxn 11
char map[maxn][maxn];
int ans=0;
int vis[maxn];
int n,k;
void dfs(int index,int num){
    if(index>=n &&num!=0) return ;
    if(num>n-index) return ;
    if(num==0){
        ans++;
        return ;
    }
    int i;
    for(i=0;i<n;i++){
            if(map[index][i]=='.') continue;
            if(!vis[i]){
                vis[i]=1;   //標記列
                dfs(index+1,num-1);     //表示這行放棋子
                vis[i]=0;
            }
        }
    dfs(index+1,num);   //表示這行不放棋子
}

int main(){

    while(scanf("%d%d",&n,&k)!=EOF){
        ans=0;
        if(n==-1&&k==-1) break;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cin>>map[i][j];
        dfs(0,k);
        cout<<ans<<endl;
    }
    return 0;
}

相關文章