【回溯】八皇后問題變換-X皇后
阿新 • • 發佈:2020-12-25
問題描述
請輸出字典序最小的x皇后問題對應的排列。
輸入
一個數x
輸出
包括一行,輸出1~x的一個排列,滿足x皇后問題的要求。
解法:老規矩回溯求解
思路
回溯是按照深度搜索來的,搜尋出來的第一個答案就是字典序就是最小,列印輸出即可
程式碼
import java.util.Scanner;
/**
* 請輸出字典序最小的x皇后問題對應的排列。
* (x<=10)
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
// arr[i] = j : 表示第i行j列放置了一個皇后
int[] arr = new int[n];
queen(arr,0, n);
}
/**
* 回溯解法
*/
private static void queen(int[] arr, int i, int n) {
if(i == n){
// 回溯本來就是按照字典序帶出的,所以列印第一個答案就完美收工
for (int ii = 0; ii < n; ii++) {
System.out.print((arr[ii] + 1) + " ");
}
// 程式任務完成,結束
System.exit(0);
}else {
for (int j = 0; j < n; j++) {
// 往第i行第j列放置一個皇后
arr[i] = j;
// 判斷前面放的i行是否符合條件,如果符合,則放置下一行,如果不符合,繼續試探j + 1列
if(judge(arr, i)){
queen(arr, i + 1, n);
}
}
}
}
/**
* 判斷已經放置的皇后位置是否可行
*/
private static boolean judge(int[] arr, int i) {
for (int ii = 0; ii < i; ii++) {
// 同列 || 主斜線 || 副斜線
if(arr[i] == arr[ii] || i - ii == arr[i] - arr[ii] || i - ii == arr[ii] - arr[i]){
return false;
}
}
return true;
}
}