kuangbin专题每日一题 棋盘问题 POJ-1321

Posted zjj0624

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kuangbin专题每日一题 棋盘问题 POJ-1321相关的知识,希望对你有一定的参考价值。

题意
给你一个棋盘,棋盘上有两种点一种可以放棋子,一种不可以放棋子。
多组读入,每次读入一个n,一个k,n是棋盘的规格,n*n的棋盘,然后k是要放的棋子数,然后还有一个n * n的字符串由.和 # 组成,# 是可以放棋子的,问有多少种放的方法,可以使每一个棋子都不同行和同列。
思路
我们可以枚举每一个点,然后从这个点开始DFS,然后每次都不同行,列的话就用一个数组来标记,就可以轻松解决了。
代码

#include<iostream>
#include<algorithm>
#include<memory.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
#define rep(a,b,c) for(int a=b;a<=c;++a)
#define per(a,b,c) for(int a=b;a>=c;--a)
const int N = 1e7 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
char s[10][10];
bool vis[10];
int ans,n,k;
void dfs(int start,int num)
{
    if(num==0)
    {
        ans++;
        return ;
    }
    for(int i=start ; i<=n ; i++)
    {
        for(int j=1 ; j<=n ; j++)
        {
            if(s[i][j]=='#'&&!vis[j])
            {
                vis[j]=true;
                dfs(i+1,num-1);
                vis[j]=false;
            }
        }
    }
}
int main()
{
    while(cin>>n>>k)
    {
        if(n==-1&&k==-1) break;
        for(int i=1 ; i<=n ; i++)
            for(int j=1 ; j<=n ; j++)
                cin>>s[i][j];
        ans=0;
        for(int i=1 ; i<=n ; i++)
        {
            for(int j=1 ; j<=n ; j++)
            {
                memset(vis,false,sizeof vis);
                if(s[i][j]=='#')
                {
                    vis[j]=true;
                    dfs(i+1,k-1);
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

以上是关于kuangbin专题每日一题 棋盘问题 POJ-1321的主要内容,如果未能解决你的问题,请参考以下文章

kuangbin专题每日一题 棋盘问题 POJ-1321

kuangbin专题每日一题 棋盘问题 POJ-1321

[kuangbin带你飞]专题一 简单搜索 棋盘问题

POJ棋盘问题(kuangbin带你飞搜索专题)

[kuangbin带你飞]专题一 简单搜索 A - 棋盘问题

kuangbin专题总结一 简单搜索