N皇后

本文深入探讨了N皇后问题的解决方法,详细解释了如何使用递归加回溯算法来寻找所有可能的解决方案,确保每个皇后都不会受到其他皇后的威胁。通过具体实例,展示了算法的工作流程和实现细节。

问题描述

N皇后问题是一个以国际象棋为背景的问题:如何能够在 N×N 的国际象棋棋盘上放置N个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

解题思路

采取递归+回溯的解法。回溯法又称试探法。回溯法的基本做法是深度优先搜索。即从一条路往前走,能进则进,不能进则退回来,换一条路再试。

代码

输入:

10  ---- 10个测试用例
1   ---- N
2
3
4
5
6
7
8
9
10

输出:

#1 1
#2 0
#3 0
#4 2
#5 10
#6 4
#7 40
#8 92
#9 352
#10 724

import java.util.LinkedList;
import java.util.Scanner;

public class NQueen {

    static int N;
    static int answer;
    static LinkedList<Integer[]> visited;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int test_case = scanner.nextInt();
        for (int T=1;T<=test_case;T++){
            N = scanner.nextInt();
            answer = 0;
            visited = new LinkedList();
            dfs(0);//从第0行开始递归

            System.out.println("#"+T+" "+answer);

        }
        scanner.close();

    }

    static void dfs(int n){
        if(n == N){//递归结束条件:递归到了N
            answer++;
            return;
        }
        int length = visited.size();
        for (int i=0;i<N;i++){
            boolean flag = true;
            //判断第n行第i列是否可以放皇后
            for (int j=0;j<length;j++){
                Integer[] tPoint = visited.get(j);
                if(tPoint[1] == i || Math.abs(n-tPoint[0]) == Math.abs(i-tPoint[1])){
                    flag = false;
                }
            }

            //第n行第i列可以放皇后则进行递归回溯
            if(flag){
                Integer[] point = new Integer[2];
                point[0] = n;
                point[1] = i;
                visited.add(point);
                dfs(n+1);
                visited.pollLast();
            }

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值