目录
1、什么是n后问题:
1.问题描述
在nxn格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线 上的棋子。n后问题等价于,在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
2、n后问题解析。
根据分析得出隐含条件。
根据要求,题目要求举例子:
回溯法解n后问题,输入n,分行输出所有可行解。
实例:
输入:n=4
输出:2 4 1 3 (第1组可行解,2表示皇后1在1行2列,4表示皇后2在2行4列,1表示皇后3在3行1列 等)
3 1 4 2 (第2组可行解)
接下来开始实现代码
3、代码实现:
功能类NQueen
package com.xxxy.javase.nbackproblem;
public class NQueen {
static int n; //皇后个数
static int[] x; //当前解
static long sum; //当前已找到的可行方案
//非递归方式进行
public static long nQueen(int nn){
n = nn;
sum = 0;
x = new int[n + 1];
for(int i = 0; i <= n; i++)
{
x[i] = 0;
}
backtrack();
return sum;
}
private static void backtrack() {
x[1] = 0;
int k = 1;
while(k > 0)
{
x[k] += 1;
while((x[k] <= n) && !(place(k)))
{
x[k] += 1;
}
if(x[k] <= n)
{
if(k == n)
{
sum++;
System.out.print("可行解为:> ");
for(int i = 1; i <= n; i++)
{
System.out.print(x[i] + " ");
}
System.out.println();
}
else
{
k++;
x[k] = 0;
}
}
else
{
k--;
}
}
}
private static boolean place(int k) {
for(int j = 1; j < k; j++)
{
if((Math.abs(k-j)) == (Math.abs(x[j] - x[k])) || (x[k] == x[j]))
return false;
}
return true;
}
//递归方式进行
/*public static long nQueen(int nn){
n = nn;
sum = 0;
x = new int[n + 1];
for(int i = 0; i <= n; i++)
{
x[i] = 0;
}
backtrack(1);
return sum;
}
private static void backtrack(int t) {
if(t > n){
sum++;
System.out.print("可行解为:> ");
for(int i = 1; i <= n; i++)
{
System.out.print(x[i] + " ");
}
System.out.println();
}
else{
for(int i = 1; i <= n; i++)
{
x[t] = i;
if(place(t))
backtrack(t+1);
}
}
}
private static boolean place(int k) {
for(int j = 1; j < k; j++)
{
if((Math.abs(k-j)) == (Math.abs(x[j] - x[k])) || (x[k] == x[j]))
return false;
}
return true;
}*/
}
测试类Test
package com.xxxy.javase.nbackproblem;
import java.util.Scanner;
public class NQueenTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = 3;
while(k > 0)
{
System.out.print("请输入皇后的个数:>");
int n = scanner.nextInt();
NQueen.nQueen(n);
System.out.println("可行解的个数为:> " + NQueen.sum);
System.out.println();
k--;
}
}
}
喜欢的话留个赞