import java.util.*;
/*
递归
循环行n列,自定义n行{
第n个。n行,下,判断是否存在行系统,列相同,对角线。
有就下一个。没有就添加。继续递归
一直递归到list有n个元素位置
}
*/
public class HelloWorld {
static ArrayList<LinkedList<Integer[]>> result =new ArrayList();
static LinkedList<Integer[]> list=new LinkedList();
public static void main(String[] args) {
//皇后数量
int n=4;
backtracking(0,n);
for(LinkedList<Integer[]> arr:result) {
for(Integer[] irr:arr) {
System.out.println(irr[0]+" "+irr[1]);
}
System.out.println("-------");
}
}
static void backtracking(int i,int n) {
if(list.size()==n) {
result.add(new LinkedList(list));
return;
}
for(int j=0; j<n; j++) {
if(check(i,j)) {
list.add(new Integer[] {i,j});
backtracking(i+1,n);
list.removeLast();
}
}
}
static boolean check(int i,int j) {
for(Integer[] arr:list) {
int row= arr[0]-i;
int col= arr[1]-j;
//检查是否存在同行,为0就是行和列可能有一个同行同列
if(row==0 || col==0) {
return false;
}
//是不是对角线 对角线意味着 两个距离相同。这样才会有45度和135度
if(Math.abs(row)==Math.abs(col)) {
return false;
}
}
return true;
}
}
N皇后 java (甚进,不解释代码)回溯
最新推荐文章于 2024-10-01 23:05:47 发布