n皇后问题扩展

来源:互联网 发布:淘宝买摩托车 编辑:程序博客网 时间:2024/06/11 22:59

回溯法本质为:在for循环里回到上一个再次运行,利用递归,不断循环调用,枚举出所有可能情况。

本题为求订阅者与订阅主题之间一一对应关系,求有多少种情况。

分析:得到订阅者和订阅主题之间的矩阵;

         在矩阵关系中枚举出所有可能出现的情况;

         将这些情况与矩阵关系进行比较,若符合规定则,情况count加1。



import java.util.*;

public class Demo_Ali {
static int count = 0;
static long caculateSubs(int n, int[][] array) {
Init(n,array);
for (int i = 0; i < n; i++) {
column[i] = 0;
}
backTree(0,array);
return count;
}


private static void Init(int n, int[][] array) {
column=new int[n];
queen=new int[n];
}


static int[] column;
static int[] queen;


/*
* 先列出所有可能的排列组合,在与array数组比较是否可行,若可行,则count加1queen[] 为一种可能的排列组合情况,
*/
private static void backTree(int n, int[][] array) {
if (n >= array[0].length) {
showArray(array[0].length,array);
} else {
for (int i = 0; i < array[0].length; i++) {
if (column[i] == 0) {
queen[n] = i+1;
column[i] = 1;
backTree(n+1, array);
column[i]=0;
}
}
}
}


private static void showArray(int n,int[][] array) {

         int num=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(queen[i]==j+1&&array[i][j]==1){
//System.out.print("1  ");
num++;
}else {
// System.out.print("0  ");
}
}
//System.out.println();
}
if(num==array[0].length){
System.out.println("一个匹配");
count++;
}
//System.out.println("=========");
}


public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long res;


int _n;
_n = Integer.parseInt(in.nextLine().trim());


int _array_rows = 0;
int _array_cols = 0;
_array_rows = _n;
_array_cols = _n;


int[][] _array = new int[_array_rows][_array_cols];
for (int _array_i = 0; _array_i < _array_rows; _array_i++) {
for (int _array_j = 0; _array_j < _array_cols; _array_j++) {
_array[_array_i][_array_j] = in.nextInt();


}
}


if (in.hasNextLine()) {
in.nextLine();
}


res = caculateSubs(_n, _array);
System.out.println(String.valueOf(res));


}
}

0 0
原创粉丝点击