题目链接
题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
分析:dfs水题。
争取从今天开始用多用java吧
JAVA
import java.util.*;
//import java.math.BigInteger;
public class Main{
public static int n;
public static int k;
public static int ans;
public static int vis[]=new int [10];
public static char a[][]=new char [10][10];
public static void dfs(int row, int step) {
if (step==k) {
ans++;
return;
}
for (int i=row; i<n; i++) {
for (int j=0; j<n; j++) {
if (a[i][j]=='#' && vis[j]==0) {
vis[j]++;
dfs(i+1,step+1);
vis[j]--;
}
}
}
return ;
}
public static void main(String[] args) {
Scanner cin =new Scanner (System.in);
while (cin.hasNext()) {
ans=0;
n=cin.nextInt();
k=cin.nextInt();
if (n==-1 && k==-1) break;
for (int i=0; i<n; i++) {
vis[i]=0;
for (int j=0; j<n; j++) {
a[i][j]='\0';
}
}
for (int i=0; i<n; i++) {
String t=cin.next();
for (int j=0; j<n; j++) {
a[i][j]=t.charAt(j);
}
}
dfs(0,0);
System.out.println(ans);
}
cin.close();
}
}
C++
#include <iostream>
#include <cstring>
using namespace std;
int n,k;
int ans=0;
char a[10][10];
int vis[10];
void dfs(int row, int step){
if (step==k){
ans++;
return;
}
for (int i=row; i<n; i++){
for (int j=0; j<n; j++){
if (a[i][j]=='#' && !vis[j]){
vis[j]++;
dfs(i+1,step+1);
vis[j]--;
}
}
}
return;
}
int main(){
while (cin>>n>>k){
if (n==-1 && k==-1) break;
ans=0;
memset(a,'\0',sizeof(a));
memset(vis,0,sizeof(vis));
for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
cin>>a[i][j];
}
}
dfs(0,0);
cout<<ans<<endl;
}
}