N皇后 (25分)

N皇后 (25分)
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法

输入格式:
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;

输出格式:
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量

输入样例:
在这里给出一组输入。例如:

1
8
5

输出样例:
在这里给出相应的输出。例如:

1
92
10

代码如下:

方法一:

投机取巧法:手画出前十个的排列,然后定义为数组

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] x = {1,0,0,2,10,4,40,92,352,724};
		if(sc.hasNext()) {
			
			int n = sc.nextInt();
			System.out.println(x[n-1]);
		}
		
		sc.close();
		
	}
}

N皇后具体算法:

摘自百度百科

package PTA20191211;
public class NQueen {
    private int n;
    private long count;
    private int[] arr;
//    private int nn;

    public NQueen(int n){
        this.n = n;
  //      nn = (1 << n) - 1;
        count = 0;
        arr = new int[n];
    }


    /**
     * row col   i  arr[i]
     * @param row
     * @param col
     * @return
     */
    public boolean Check(int row, int col){
        for(int i = 0; i < row; i++){
            if(col == arr[i] || Math.abs(row - i) == Math.abs(col - arr[i])) //在同一列或者在同一斜线。一定不在同一行
                return false;
        }
        return true;
    }

    public void FindNQueen(int k) {
        if (k == n) {   //求出一种解, count+1
            count++;
            return;
        }

        for (int i = 0; i < n; i++) {
            if (Check(k, i)) {   //检查是否满足条件
                arr[k] = i;      //记录
                FindNQueen(k + 1);   //递归查找
            }
        }

    }

    public static void main(String args[]){
        NQueen nQueen = new NQueen(10);
        nQueen.FindNQueen(0);
        System.out.println(nQueen.count);
    }

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