DFS練習 【遞歸入門】n皇后 問題(原始的8皇后問題)

題目描述

       會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。 

 

輸入

一個整數n( 1 < = n < = 10 ) 

輸出

每行輸出對應一種方案,按字典序輸出所有方案。每種方案順序輸出皇后所在的列號,相鄰兩數之間用空格隔開。如果一組可行方案都沒有,輸出“no solute!”

樣例輸入

4

樣例輸出

2 4 1 3
3 1 4 2

【代碼】:

import java.util.Scanner;

public class Main {
	static int n;
	static int p[];
	static boolean flag;
	static boolean vis[];

	static void dfs(int index) {
		for (int i = 0; i < index - 1; i++) {// 剪枝
			for (int j = i + 1; j < index; j++) {
				if (i - j == p[i] - p[j] || p[i] + i == p[j] + j)
					return;
			}
		}
		if (index == n) {
			print();
			return;
		}
		for (int i = 0; i < n; i++) {
			if (vis[i] == false) {
				p[index] = i;
				vis[i] = true;
				dfs(index + 1);
				vis[i] = false;
			}
		}

	}

	static void print() {
		// TODO Auto-generated method stub
		for (int i = 0; i < n; i++) {
			System.out.print(p[i] + 1 + " ");
		}
		System.out.println();
		flag = false;
	}

	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		p = new int[n + 1];
		flag = true;
		vis = new boolean[n + 1];
		dfs(0);
		if (flag)
			System.out.println("no solute!");
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章