Java实现N皇后(搜索和非递归)

LintCode题目链接

描述

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

样例

例1:

输入:1
输出:
   [["Q"]]


例2:

输入:4
输出:
[
  // Solution 1
  [".Q..",
   "...Q",
   "Q...",
   "..Q."
  ],
  // Solution 2
  ["..Q.",
   "Q...",
   "...Q",
   ".Q.."
  ]
]

深度搜索遍历

import java.util.ArrayList;
import java.util.Scanner;

/**
 * N皇后问题
 * 深度搜索
 * @author qgfzzzzzz
 *
 */
public class DFSOfNQueues {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		ArrayList> listAll = nQueues(n);
		System.out.println(listAll);
	}
	public static ArrayList> nQueues(int n) {
		ArrayList> listAll = new ArrayList<>();
		char[][] ch = new char[n][n];
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				ch[i][j] = '.';
			}
		}
		dfs(0, n, ch, listAll);
		return listAll;
	}
	public static void dfs(int row, int n, char[][] ch, ArrayList> listAll) {
		if(row == n) {
			ArrayList list = new ArrayList<>();
			for(int i = 0; i < n; i++) {
				StringBuilder stringBuilder = new StringBuilder();
				for(int j = 0; j < n; j++) {
					stringBuilder.append(String.valueOf(ch[i][j]));
				}
				list.add(stringBuilder.toString());
			}
			listAll.add(list);
			return;
		}
		for(int i = 0; i < n; i++) {
			if(isPlace(ch, n, row, i)) {
				ch[row][i] = 'Q';
				dfs(row + 1, n, ch, listAll);
				ch[row][i] = '.';
			}
		}
	}
	public static boolean isPlace(char[][] ch, int n, int row, int col) {
		for(int i = 0; i < row; i++) {
			if(ch[i][col] == 'Q') return false;
			if(row + col - i < n && ch[i][row + col - i] == 'Q') return false;
			if(col - row + i >= 0 && ch[i][col - row + i] == 'Q') return false;
		}
		return true;
	}
}

非递归

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * N皇后问题
 * 非递归
 * @author LENOVO
 *
 */
public class LoopOfNQueues {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		List> listAll = new ArrayList>();
		int[] pos = new int[n];
		for(int i = 0; i < n; i++) pos[i] = -1;
		int row = 0;
		while(row >= 0) {
			while(++pos[row] < n && !isPlace(pos, row)) {}
			if(pos[row] < n) {
				if(row == n - 1) {
					List list = new ArrayList<>();
					for(int i = 0; i < n; i++) {
						StringBuilder sBuilder = new StringBuilder();
						for(int j = 0; j < n; j++) {
							if(pos[i] == j) sBuilder.append("Q");
							else sBuilder.append(".");
						}
						list.add(sBuilder.toString());
					}
					listAll.add(list);
					--row;
				}
				else {
					pos[++row] = -1;
				}
			}
			else row--;
		}
		System.out.println(listAll);
	}
	public static boolean isPlace(int[] pos, int row) {
		for(int i = 0; i < row; i++) {
			if(pos[i] == pos[row] || Math.abs(pos[i] - pos[row]) == row - i) return false;
		}
		return true;
	}
}

 

你可能感兴趣的:(数据结构算法)