八皇后问题(深搜+回溯)

1213:八皇后问题

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 25209 通过数: 9181
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

【输入】
(无)

【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。

【输入样例】
(无)
【输出样例】
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
…以下省略提
思路分析:该题继续套用深搜回溯模板
利用递归遍历回溯每一种可能性结果
递归结束的条件为八行每一行都安排完一种情况需要return;
在递归过程中for循环是遍历的每一列的方案数,而递归dfs的参数是对每一行的情况的遍历。在for循环中,判断if的条件为(检查每一列,每一右斜,左斜列都不存在棋子则判断为满足条件),进入if语句中将该位置放下棋子置为1,并向下一行dfs(r+1)递归。回溯只需要将该棋子收回也就是数组元素置为0。
在判断方案满足条件时不需要特意检测每一行,因为递归参数r的限制自动++,不会出现行上重复的情况,检查每一列,列保持不变。
检查每一左倾斜列(j - z == r - i && a[j][z] == 1)
右倾斜列 (j + z == r + i && a[j][z] == 1)
在这里插入图片描述


import java.util.*;

public class Main {
   
    static int num = 0;
    static int a[][] = new int[10][10];

    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        dfs(1);
    }

    static void print() {
   
        System.out.println("No." + num);
        for (int j = 1; j <= 8; j++) {
   
            for (int z = 1; z <= 8
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值