n皇后问题扩展
2017-04-11 14:51
134 查看
回溯法本质为:在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
;
queen=new int
;
}
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
= 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));
}
}
本题为求订阅者与订阅主题之间一一对应关系,求有多少种情况。
分析:得到订阅者和订阅主题之间的矩阵;
在矩阵关系中枚举出所有可能出现的情况;
将这些情况与矩阵关系进行比较,若符合规定则,情况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
;
queen=new int
;
}
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
= 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));
}
}
相关文章推荐
- 八皇后问题(扩展:N皇后问题)
- 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 八皇后扩展--n皇后问题 使用回溯法
- 八皇后问题的扩展,任意数量皇后问题的较快速解法
- 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 用回溯法解决皇后问题的实现思考
- Sybase ASE段不能自动扩展空间的问题
- 八皇后问题 -当时写给老师的一封E-mail
- 对求解“皇后排列问题”的一个新解法!
- 8皇后问题
- N皇后问题(递归回溯的学习)
- 皇后问题的一个解法
- 回溯法求解8皇后问题(转帖)
- 目前最快的N皇后问题算法!!!
- 回溯法解决N皇后问题
- *.jspf扩展名文件在jsp:include、@include和c:import中的区别、问题和解决
- 在Windows 2003下安装FrontPage服务器扩展遇到的问题
- 8皇后问题改进~
- 最近碰到个问题,关于php扩展编程如何返回数组的问题