NEFU OJ 1606 QWQ和棋局挑战
Problem:1606
Time Limit:1000ms
Memory Limit:65535K
Description
众所周知QWQ的棋艺已经到了独孤求败的地步,某日一位来自泰坦星的勇士前来向QWQ发起挑战,不过挑战的项目却非常奇怪:这位勇士要求QWQ在一个n x n大小的棋盘上放置k个棋子,并要求放置后的棋盘上每一行和每一列最多有一个棋子,显然这个问题是如此的简单,所以这位勇士要求QWQ告诉他这样的棋局共有多少种?
你能帮助QWQ解决这个问题么?
Input
每组输入占据一行
一行有两个数字 分别表示棋盘的大小n和要求放置的棋子k
0<n<9 , 0<k<=n
Output
每组输入占据一行
输出这样的棋局的种类数目
Sample Input
样例一:
2 1
样例二:
2 2
Sample Output
样例一:
4
样例二:
2
Tips
类似八皇后的解法 ヾ(≧▽≦*)o
(据说还可以用更简单的排列组合解)
Code
#include <bits/stdc++.h>
using namespace std;
int mapp[10],res;
int n,k;
int check(int l)
{
for(int i=0;i<l;i++)
{
if(l==mapp[i])return 0;
}
return 1;
}
void dfs(int l,int s)
{
//cout<<l<<" ";
if(l>n)return;
if(s>=k)
{
res++;
return;
}
mapp[l]=-1;
dfs(l+1,s);
for(int i=0;i<n;i++)
{
mapp[l]=i;
if(check(l))dfs(l+1,s+1);
}
}
int main()
{
while(cin>>n>>k)
{
res=0;
dfs(0,0);
cout<<res<<endl;
}
return 0;
}
本文探讨了一个有趣的排列组合问题,勇士挑战QWQ在nxn棋盘上放置k个棋子,要求每行每列最多只有一个棋子,目标是计算所有可能的棋局种类。文章提供了一种递归深度优先搜索的解决方案,并暗示了更简单的排列组合方法。
766

被折叠的 条评论
为什么被折叠?



