棋盘问题
题目:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。
要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k
个棋子的所有可行的摆放方案数目 C。
输入格式
输入含有多组测试数据。
每组数据的第一行是两个正整数 n,k,用一个空格隔开,表示了将在一个 n∗n
的矩阵内描述棋盘,以及摆放棋子的数目。当为-1 -1时表示输入结束。随后的 n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域,表示空白区域(数据保证不出现多余的空白行或者空白列。
输出格式
对于每一组数据,给出一行输出,输出摆放的方案数目 C(数据保证 C<231)。
数据范围
n≤8,k≤n
测试用列:
输入样例:
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
输出样例:
2
1
题目分析:
1.递归
2.回溯
题目代码:
package javaBase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Scanner;
public class Main {
static int n,k; //记录n和k
static char[][] nums;//数组
static int ans=0 ;//答案
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
n = sc.nextInt();
k=sc.nextInt();
if (n==-1&&k==-1) {
break;
}
nums =new char [n][n];
sc.nextLine();
for (int i = 0; i < n; i++) {
String line = sc.nextLine();
char[] temp =line.toCharArray();
for (int j = 0; j < temp.length; j++) {
nums[i][j]=temp[j];
}
}
int []visit = new int [n];
Arrays.fill(visit, 0);
int x=0;//放了几个棋子
dfs(x,nums,visit);
System.out.println(ans);
ans=0;
}
}
private static void dfs(int x, char[][] nums, int[] visit) {
// TODO Auto-generated method stub
if (x==k) {
ans+=1;
return;
}
for (int i = x; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
if (nums[i][j]=='#'&&visit[j]==0) {
visit[j]=1;
x++;
dfs(x, nums, visit);
visit[j]=0;
x--;
}
}
}
}
}