当前位置: 首页 > article >正文

特辣的海藻!8

1.843. n-皇后问题 - AcWing题库

 大名鼎鼎N皇后

import java.util.*;

public class Main {
    static int N = 10;
    static int n;
    static char[][] map = new char[N][N];
    static boolean[] row = new boolean[N];
    static boolean[] col = new boolean[N];
    static boolean[] dg = new boolean[N*2];
    static boolean[] udg = new boolean[N*2];

    static void dfs(int u, int x, int y) {
        if(u > n)
            return ;
        if(y == n) {
            y = 0;
            x += 1;
        }

        if(x == n) {
            if(u == n) {
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        System.out.print(map[i][j]);
                    }
                    System.out.println();
                }
                System.out.println();
            }
            return ;
        }

        // 这一列不放皇后
        dfs(u, x, y+1);

        if(!row[x] && !col[y] && !dg[x-y+n] && !udg[x+y]) {
            map[x][y] = 'Q';
            row[x] = col[y] = dg[x-y+n] = udg[x+y] = true;
            dfs(u+1, x, y+1);
            map[x][y] = '.';
            row[x] = col[y] = dg[x-y+n] = udg[x+y] = false;
        }

    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++) {
                map[i][j] = '.';
            }
        }

        dfs(0, 0, 0);

        scan.close();
    }

}

//zhuanxinyidian!!!

这是第一种搜索顺序,目前先掌握这一种。

N皇后的思路就是,按照行的顺序,以每一行的视角来看每一列,这样来遍历每一个格子是不是能放皇后,u记录当前放的是第几个皇后。

当u>n的时候,说明已经遍历到最底层,我们可以开始模拟放皇后,一层一层返回了。当y==n时,说明此时遍历的位置已经超出边界,换下一行的第一个格子看。当x==n时u==n,说明在最后一行,最后一个皇后也放好了,说明当前这个矩阵就满足条件了,可以输出了。

因为是深度优先遍历,是一定会一行一行的遍历下去的。然后对于每一行来说,有两种选择,第一是在这一列放皇后,判断位置是否满足条件;第二是向下一层递归,在下一列放皇后。

如果这一行、这一列、主对角线、副对角线都没有放过皇后,那么久放!然后将标记数组给标记一下。放的皇后个数加1,列加1,为什么不行加1,因为我们要模拟所有的格子,模拟每种情况,不能漏掉。

2.842. 排列数字 - AcWing题库

 

import java.util.*;

public class Main {
    static int n;
    static final int N = 10;
    static int[] path = new int[N];
    static boolean[] st = new boolean[N];
    
    static void dfs(int u) {
        if(u == n) {
            for(int i = 0;  i < n; i++){
                System.out.print(path[i] + " ");
            }
            System.out.println();
            return;
        }

        for(int i = 1; i <= n; i++) {
            if(!st[i]) {
                st[i] = true;
                path[u] = i;
                
                dfs(u+1);
                
                // 不恢复也可以,因为后续这个path[i]会不断被覆盖
                path[u] = 0;
                st[i] = false;
            }
        }
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        
        dfs(0);    
        
        scan.close();
    }
}

有n个位置放数字,第一个位置的数字放好之后,还有n-1个位置。

对于第n-1个位置,第n-1个位置放好之后,还有n-2个位置。

。。。

就这样一层一层的递归下去,返回的时候又模拟出不同的情况。


http://www.kler.cn/a/572756.html

相关文章:

  • @PostConstruct注解的作用
  • 【前端学习笔记】Git 原理及面试题
  • 用本地浏览器打开服务器上使用的Tensorboard
  • 自学微信小程序的第十三天
  • 【Spring Boot 应用开发】-04-02 自动配置-数据源-手撸一个最简持久层工具类
  • 驱动开发系列43 - Linux 显卡KMD驱动代码分析(四)- DRM设备操作
  • Golang的数据库分库分表
  • 【网络安全】API安全防护完整指南
  • 【计算机网络入门】TCP拥塞控制
  • OpenGL ES -> GLSurfaceView纹理贴图
  • 词向量(Word Embedding)
  • 【SegRNN 源码理解】图示理解 forward的过程
  • 使用 marked.min.js 实现 Markdown 编辑器 —— 我的博客后台选择之旅
  • MySQL8 忘记密码
  • 【金融量化】Ptrade中交易环境支持的业务类型
  • Mysql命令大全(连接Mysql)
  • 单体架构、集群、分布式、微服务的区别!
  • Web服务器配置
  • shell文本处理
  • 美股行情数据:历史高频分钟回测数据策略分析