1217 棋盘问题

#include<bits/stdc++.h>
using namespace std;
int n,k,sum;
char mp[10][10];
bool l[10];

void dfs(int x,int y){
    if(y>=k){
        sum++;
        return ;
    }//每摆完一组棋子,方案加一,回溯
    
    for(int i=x;i<n;i++){//从第x行开始,因为先前摆过的行不需要重复考虑 
        for(int j=0;j<n;j++){//列的遍历需要从0开始 
            if(!l[j] && mp[i][j]=='#'){//判定条件:1.列上没有棋子 2.棋子必须在棋盘上 
                l[j]=true;
                dfs(i+1,y+1);
                l[j]=false;//搜索完了记得恢复 
            }
        }
    } 
}
int main(){
    while(1){
        cin>>n>>k;
        getchar();
        if(n==-1 && k==-1) break;//结束条件 
        memset(mp,false,sizeof(mp));//初始化 
        memset(l,false,sizeof(l));
        for(int i=0;i<n;i++) cin>>mp[i];//输入棋盘 
        sum=0;//初始方案 
        dfs(0,0);//first 0 :棋子所在行数 second 0 :第几个棋子
        cout<<sum<<endl; 
    } 
    return 0;
}

 

posted @ 2020-10-04 20:16  ssdaeda  阅读(202)  评论(0编辑  收藏  举报