赞
踩
N皇后问题
N皇后问题是值在N*N的棋盘上要摆N个皇后
要求任何两个皇后不同行,不同列,也不在同一条斜线上
返回摆法的种类
限制行,让每一行只能摆一个元素
用一个数组来表示放的位置,record[0...i-1]
比如record[0]=7代表0行的元素放在了7列,也就是说下标表示行,值表示列
当到达终止行时返回,
如果没有到终止位置假设当前在第i行,
递归尝试所有的列
如果可以摆的话就继续递归,如果不是,则认为无效
怎么验证可以摆哪?
- public static int num(int n) {
- if(n<1) return 0;
- int []record=new int[n];
- return process1(0,record,n);
- }
- //n表示结束位置
- //record[0..i-1]表示之前的行,放了皇后的位置
- //i是多少行
- public static int process1(int i,int []record,int n) {
- if(i==n) return 1;//终结行
- //没到终结位置,还有皇后要摆
- int res=0;
- for(int j=0;j<n;j++) { //当前行在i行,尝试i行所有的列 j
- //当前第i行的皇后,放在j列,会不会和之前(0..i-1)的皇后,不共行共列或者共斜线
- if(isValid(record,i,j)) {
- record[i]=j;
- res+=process1(i+1,record,n);
- }
- }
- return res;
- }
- //返回i行皇后,放在j列,是否有效
- public static boolean isValid(int []record,int i,int j) {
- for(int k=0;k<i;k++) {//之前的某个k行的皇后
- if(j==record[k] || Math.abs(record[k]-j) == Math.abs(i-k)) {
- return false;
- }
- }
- return true;
- }
- public static void main(String[] args) {
- System.out.println(num(8));
- }
结果:92
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。