欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

poj 1321 棋盘问题

程序员文章站 2022-05-20 21:10:21
...

题目  中文题目,题意不在赘述,思路代码中。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

char mp[10][10];
int vis[10];
int cnt = 0;
int n,k;
/**
    采用的是按行递增的顺序来搜索的, 
    因此不可能出现同行的情况, 
    对于同列的情况,设置一个变量vis[],来保存列的访问状态,
    对于之前访问过的列, 棋子是不能再放在这一列上的.
*/
int dfs(int x,int y)//第x行,放第y颗棋子
{
    if(y>=k){
        cnt++;//记录这个方案可行
        return 0;
    }
    for(int i=x;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(mp[i][j]=='#'&&!vis[j])
            {
                vis[j]=1;
                dfs(i+1,y+1);//搜素下一行
                vis[j]=0;
            }
        }
    }
    return 0;
}
int main()
{
    while(cin>>n>>k)
    {
        if(n==-1&&k==-1) break;
        for(int i=0;i<n;i++)
            cin>>mp[i];
        memset(vis,0,sizeof(vis));
         cnt = 0;
        dfs(0,0);
        cout<<cnt<<endl;
    }
    return 0;
}

 

相关标签: dfs