N皇后问题
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1 8 5 0Sample Output
1 92 10思路:
- DFS+打表
AcCode:
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); while(true) { int N = in.nextInt(); if(N==0) { break; } int[] res = new int[] {0,1,0,0,2,10,4,40,92,352,724}; System.out.println(res[N]); // count = 0; // int[] rec = new int[N+1];//从1开始计数 // dfs(1,rec); // System.out.println(count); } } public static int count = 0; private static void dfs(int row, int[] rec) { if(row==rec.length) { count++; return; } for (int i = 1; i < rec.length; i++) { if(check(rec,row,i)) {//检查皇后放入该位置是否合法(提前剪枝) rec[row] = i; dfs(row+1, rec); //回溯 rec[row] = 0;//这里也可以不用回溯,因为认为这是新的一行 } } } private static boolean check(int[] rec, int row, int col) { for (int i = 1; i < row; i++) { //检查列 if(rec[i]==col) { return false; } //检查副对角线上能否放皇后 if(i+rec[i]==row+col) { return false; } //检查正对角线上能否放皇后 if(i-rec[i]==row-col) { return false; } } return true; } }
N皇后问题 (HDU - 2553)
最新推荐文章于 2021-01-31 11:15:50 发布