POJ - 1321棋盘问题(dfs)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxiyulu/article/details/77980309
/*
dfs
*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,k;
char mp[10][10];
bool vis[10];//第i列是否放过棋子
int ans;
//row为行,cnt为已经放了多少个棋子
void dfs(int row,int cnt)
{
    if(row>=n&&cnt!=k) return ;
    if(k-cnt>n-row) return ;//剩余的行数不足以放完棋子
    if(cnt==k)
    {
        ans++;
        return ;
    }
    for(int i=0;i<n;i++)//枚举每一列
    {
        if(mp[row][i]=='#'&&vis[i]==0)
        {
            vis[i]=1;
            dfs(row+1,cnt+1);//当前位置放一个棋子
            vis[i]=0;//标记复位
        }
    }
    dfs(row+1,cnt);//当前位置不放棋子
}

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1) break;
        for(int i=0;i<n;i++)
        {
            scanf("%s",mp[i]);
        }
        ans=0;
        memset(vis,0,sizeof(vis));
        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhuxiyulu/article/details/77980309