标签:就是 状态 ring code names 循环 形状 oid 初始
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,
请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
book[MA]//该行是否放棋子
单纯考虑在n行中取k行放棋子,以为就是一个组合问题,题意没理解就做了。
没有考虑若一行有两个'#'位置的情况,所以应该双层for循环判断每一个位置是否为'#'就好了。
for(int j=i;j<n;j++)
for(int t=0;t<n;t++)
if(book[j]==0&&a[j][t]=='#'){
}
没有考虑列的问题,大失误。加一个row[MA]存各列的状态
#include<iostream>
#include<cstring>
using namespace std;
const int MA=10;
int n,k;
long long sum;
char a[MA][MA];
int book[MA];//这行是否放置棋子
int row[MA];
void dfs(int i,int m){//第m个棋子放在 i 到 n-1 的任一满足条件行
if(m==k+1){
sum++;
return ;
}
for(int j=i;j<n;j++){
for(int t=0;t<n;t++){
if(book[j]==0&&a[j][t]=='#'&&row[t]==0){
row[t]=1;
book[j]=1;
dfs(j+1,m+1);
book[j]=0;
row[t]=0;
}
}
}
}
int main(){
while(cin>>n>>k){
if(n==-1&&k==-1)break;
memset(book,0,sizeof(book));
memset(row,0,sizeof(row));
sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
dfs(0,1);
cout<<sum<<endl;
}
return 0;
}
标签:就是 状态 ring code names 循环 形状 oid 初始
原文地址:https://www.cnblogs.com/w-w-t/p/12240621.html