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!");
	}
}

 

你可能感兴趣的:(Java,数据结构)