版权声明:转载请注明出处即可 https://blog.csdn.net/qq_35170212/article/details/81750498
棋盘问题
Time Limit: 1000MS Memory Limit: 10000K
Description:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input:
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output:
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input:
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output:
2
1
手撕:
#include<vector>
#include<iostream>
#include<string>
using namespace std;
static bool isok(vector<string>&vr,int i,int j){
for(int k=0;k<vr.size();++k){
if(k!=i&&vr[k][j]=='x')
return false;
if(k!=j&&vr[i][k]=='x')
return false;
}
return true;
}
static void dfs(vector<string>&vr,int&cur,int k,int i,int j){
if(k==0){
cur++;
}else{
if(i<vr.size()&&j<vr[0].size()){
if(vr[i][j]!='.'&&isok(vr,i,j)){
vr[i][j]='x';
if(j+1==vr.size())
dfs(vr,cur,k-1,i+1,0);
else
dfs(vr,cur,k-1,i,j+1);
vr[i][j]='#';
}
if(j+1==vr.size())
dfs(vr,cur,k,i+1,0);
else
dfs(vr,cur,k,i,j+1);
}
}
}
测试:
int main(){
int n=0,m=0;
vector<int>res;
while(cin>>n>>m&&n!=-1&&m!=-1){
vector<string>vr(n);
for(int i=0;i<n;++i)
cin>>vr[i];
int cur=0;
dfs(vr,cur,m,0,0);
res.push_back(cur);
}
for(int i=0;i<res.size();++i){
cout<<res[i]<<endl;
}
return 0;
}