点这里去看题

 

思路:本题的难点在k<n的情况,所以我们可以另dfs中的两个参数分别代表起始行和待放棋子个数(待放棋子只能放在起始行后面的行),然后用一个c[8]来表示每一列放旗子的情况来判断列不重复

 

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int a[10][10],c[8],n,k,ans;
void dfs(int x,int num)
{
    int j,tx,nu;
    for(j=0;j<n;j++)
    {
        if(a[x][j]==1&&c[j]==0)
        {
            if(num==1)
                ans++;
            else
            {
                c[j]=1;
                tx=x+1;
                for(;tx<n-num+2;tx++)
                    dfs(tx,num-1);
                c[j]=0;
            }
        }
    }
}
int main()
{
    int i,j;
    char s;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==-1||k==-1)break;
        ans=0;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
                scanf(" %c",&s);
                if(s=='#')
                    a[i][j]=1;
                else a[i][j]=0;
            }
        }
        memset(c,0,sizeof(c));
        for(i=0;i<=n-k;i++)
        {
            dfs(i,k);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted on 2017-03-13 21:35  benTuTuT  阅读(123)  评论(0编辑  收藏  举报