POJ1321-棋盘问题-(dfs)

http://poj.org/problem?id=1321

解题:

dfs中,两种情况,某一行摆不摆?某一列摆不摆?

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

char a[10][10];
int l[10];///列
int ans;
int n,k;

void dfs(int x,int cnt)
{

    if(cnt==k)///摆k个,方案数+1
    {
        ans++;
        return;
    }
    if(x==n)///行数越界
        return;

    dfs(x+1,cnt);///这一行不摆

    for(int j=0;j<n;j++)///遍历一行,有位置就摆!
    {
        if( a[x][j]=='#' && l[j]==0 && cnt<k )///如果有位置摆就摆,没有就不摆。
        {
            l[j]=1;
            dfs( x+1,cnt+1 );///摆完就进入下一行,当前棋子数+1
            l[j]=0;///这一列不摆
        }
    }
}


int main()
{
    while( scanf("%d%d",&n,&k) && n!=-1 && k!=-1 )
    {
        memset(l,0,sizeof(l));
        memset(a,0,sizeof(a));
        ans=0;
        for(int i=0;i<n;i++)
            scanf("%s",a[i]);

        dfs(0,0);///行 棋子数
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shoulinniao/p/11173742.html