棋盘问题 POJ - 1321

#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans;
char Map[20][20],visL[11];   //标记列
void dfs(int step,int i)  // step已放的棋子数, i 当前第几行
{
    if(step==k)
    {
        ans++;
        return;
    }
    if(i>n)return;
    for(int j=1;j<=n;j++)
    {
            if(Map[i][j]=='#'&&!visL[j])
            {
                visL[j]=1;
                dfs(step+1,i+1);     //i行放棋子
                visL[j]=0;
            }

    }
    dfs(step,i+1);  //i行不放棋子
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1)break;
        for(int i=1;i<=n;i++)
            scanf("%s",Map[i]+1);
        memset(visL,0,sizeof(visL));
        ans=0;
        dfs(0,1);
        printf("%d\n",ans);

    }

    return 0;
}

 

posted @ 2017-07-26 10:11  BrysonChen  阅读(180)  评论(0编辑  收藏  举报