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的主要内容,如果未能解决你的问题,请参考以下文章