n皇后问题扩展

回溯法本质为:在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));


}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值