棋盘问题 poj 1321

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

原贴https://www.cnblogs.com/hfc-xx/p/4684152.html

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[10][10];     //记录棋盘位置
int book[10];        //记录一列是否已经放过棋子
int n,k;
int total,m;    //total 是放棋子的方案数 ,m是已放入棋盘的棋子数目

void DFS(int cur)
{
    if(k==m)
    {
        total++;
        return ;
    }
    if(cur>=n)  return ;
    for(int j=0; j<n; j++)
        if(book[j]==0 && a[cur][j]=='#')  //判断条件
        {
            book[j]=1;           //标记
            m++;                 
            DFS(cur+1);
            book[j]=0;           //改回来方便下一行的判断
            m--;
        }
    DFS(cur+1);                //到下一行
}

int main()
{
    int i,j;
    while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) //限制条件
    {
        total=0;
        m=0;
        for(i=0; i<n; i++)
            scanf("%s",&a[i]);
        memset(book,0,sizeof(book));
        DFS(0);
        printf("%d
",total);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Hunter01/p/12694733.html