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专题总结一 简单搜索