1. 程式人生 > 其它 >【回溯】八皇后問題變換-X皇后

【回溯】八皇后問題變換-X皇后

技術標籤:五大常用演算法dfs演算法

原題連結

問題描述

請輸出字典序最小的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; } }

提交結果