N-Queens
Total Accepted: 3171 Total Submissions: 12620 My Submissions
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
著名的N皇后问题,经典的DFS,我发现BFS也可以过。BFS比DFS慢了140ms。
和九度题目1140:八皇后解法一致。
Java DFS AC
public class Solution { public ArrayList<String[]> solveNQueens(int n) { list = new ArrayList<String[]>(); if(n <= 0){ return list; } int []queen = new int[n + 1]; for(int i = 1; i < n+1 ; i++){ queen[1] = i; dfs(queen,2,n); } return list; } public ArrayList<String[]> list; public void dfs(int queen[], int line, int n) { if(line == n+1){ String[] tempArr = new String[n]; for(int i = 1; i < n+1; i++){ StringBuffer sb = new StringBuffer(); for (int j = 1; j < n+1; j++) { if (queen[i] == j) { sb.append("Q"); }else { sb.append("."); } } tempArr[i-1] = sb.toString(); } list.add(tempArr); return; } for(int i = 1; i < n+1; i++){ if(valid(line, i, queen)){ queen[line] = i; dfs(queen ,line+1, n); queen[line] = 0; } } } public boolean valid(int row, int col, int []queen) { for (int i = 1; i < row; i++) { if (queen[i] != 0 && (queen[i] == col || Math.abs(i - row) == Math.abs(queen[i] - col))) return false; } return true; } }Java BFS AC
public class Solution { public ArrayList<String[]> solveNQueens(int n) { ArrayList<String[]> list = new ArrayList<String[]>(); if(n <= 0){ return list; } for(int i = 1; i < n+1; i++){ Queue<Node> queue = new LinkedList<Node>(); String[][] queenArr = new String[n+1][n+1]; queenArr[1][i] = "Q"; int location[] = new int[n+1]; location[1] = i; queue.offer(new Node(location,queenArr,1)); bfs(list,queue,n); } return list; } public void bfs(ArrayList<String[]> list,Queue<Node> queue, int n){ while(!queue.isEmpty()){ Node node = queue.peek(); queue.poll(); String [][]tempArr = node.queenArr; int location[] = node.location; int line = node.line; if(line == n){ String array[] = new String[n]; for(int i = 1; i < n+1 ; i++){ StringBuffer sb = new StringBuffer(); for(int j = 1; j < n+1; j++){ if(tempArr[i][j] == null){ tempArr[i][j] = "."; } sb.append(tempArr[i][j]); } array[i-1] = sb.toString(); } list.add(array); continue; } for(int i = 1; i < n+1; i++){ String array[][] = new String[n+1][n+1]; int queen[] = new int[n+1]; if(valid(line+1,i,location,n)){ for (int j = 1; j < n+1; j++) { queen[j] = location[j]; } queen[line+1] = i; for (int j = 1; j < n+1; j++) { for (int k = 1; k < n+1; k++) { array[j][k] = tempArr[j][k]; } } array[line+1][i] = "Q"; queue.offer(new Node(queen,array,line+1)); } } } } public boolean valid(int row, int col, int queen[], int n ) { for (int i = 1; i < row; i++) { if (queen[i] != 0 && (queen[i] == col || Math.abs(i - row) == Math.abs(queen[i] - col))){ return false; } } return true; } public class Node{ int location[]; String[][] queenArr; int line; Node(int location[], String [][]queenArr, int line){ this.location = location; this.queenArr = queenArr; this.line = line; } } }九度题目1140:八皇后 Java AC
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.ArrayList; import java.util.Collections; public class Main{ /* * 1140 */ public static void main(String[] args) throws Exception { int n = 8; // count = 0; solveNQueens(n); StreamTokenizer st = new StreamTokenizer (new BufferedReader(new InputStreamReader(System.in))); while (st.nextToken() != StreamTokenizer.TT_EOF) { int allNum = (int) st.nval; while (allNum > 0) { st.nextToken() ; int seq = (int) st.nval; // Collections.sort(arrList); // System.out.println(count); System.out.println(list.get(seq-1)); allNum -- ; } } } public static void solveNQueens(int n) { list = new ArrayList<String>(); if(n <= 0){ return; } int []queen = new int[n + 1]; for(int i = 1; i < n+1 ; i++){ queen[1] = i; dfs(queen,2,n); } Collections.sort(list); } public static ArrayList<String> list; public static void dfs(int queen[], int line, int n) { if(line == n+1){ StringBuffer sb = new StringBuffer(); for(int i = 1; i < n+1; i++){ sb.append(queen[i]); } list.add(sb.toString()); return; } for(int i = 1; i < n+1; i++){ if(valid(line, i, queen)){ int array[] = new int[n+1]; for(int j = 1; j < n+1; j++){ array[j] = queen[j]; } array[line] = i; dfs(array ,line+1, n); } } } public static boolean valid(int row, int col, int []queen) { for (int i = 1; i < row; i++) { if (queen[i] != 0 && (queen[i] == col || Math.abs(i - row) == Math.abs(queen[i] - col))) return false; } return true; } } /************************************************************** Problem: 1140 User: wangzhenqing Language: Java Result: Accepted Time:130 ms Memory:21604 kb ****************************************************************/