zoukankan      html  css  js  c++  java
  • 7.12dfs例题:数独游戏

    dfs:深度优先搜索(深搜)
    思路是把一种可能性走到底,在回头到上一个路口,走另一种可能性。

    数独游戏:
    有一个9个3*3的小格子,拼成了一个9*9的矩阵,预输入1~9这种数字到某个格子上,其余格子是0。
    我们要做的就是把没有数字的格子上添上数字,使得这个9*9的矩阵每一行每一列的数字都是1~9不重复,并且9个3*3的小矩阵中,这9个数字也只能是1~9不允许重复。

    思路:
    1.定义一个char类型的二维数组用来存储9*9的矩阵,将输入字符串转换为一个字符数组存入。
    2.dfs方法:如果当前[x][y]位置的数为0,则从1~9中挨个试填数字,如果填入的数字满足行列1~9不重复,并且当前3*3小矩阵1~9不重复,则可以填入,然后递归,传入下一个x和y位置,x的位置应该是x+(y+1)/9,y的位置应该是(y+1)%9。如果当前[x][y]位置的数不为0,则直接递归,传入下一个x和y位置。递归退出条件为x==9时。打印矩阵,终止程序。

     1 public class Seven_12dfs例题数独游戏 {
     2     private static void dfs(char[][] table, int x, int y) {
     3         if (x == 9) {
     4             print(table);
     5             System.exit(0);
     6         }
     7         if (table[x][y] == '0') {
     8             // 选择1~9之间合法的数字填到x,y这个位置
     9             for (int k = 1; k < 10; k++) {
    10                 if (check(table, x, y, k)) {
    11                     table[x][y] = (char) ('0' + k);
    12                     dfs(table, x + (y + 1) / 9, (y + 1) % 9); // 处理下一个状态
    13                 }
    14             }
    15             table[x][y] = '0'; // 回溯
    16         } else {
    17             // 如果当前位置有数字了,则继续找下一个需要处理的位置
    18             dfs(table, x + (y + 1) / 9, (y + 1) % 9);
    19         }
    20     }
    21 
    22     public static boolean check(char[][] table, int i, int j, int k) {
    23         // 检查同行和同列
    24         for (int l = 0; l < 9; l++) {
    25             if (table[i][l] == (char) ('0' + k))
    26                 return false;
    27             if (table[l][j] == (char) ('0' + k))
    28                 return false;
    29         }
    30         for (int l = (i / 3) * 3; l < (i / 3 + 1) * 3; l++) {
    31             for (int m = (j / 3) * 3; m < (j / 3 + 1) * 3; m++) {
    32                 if (table[l][m] == (char) ('0' + k))
    33                     return false;
    34             }
    35         }
    36         return true;
    37     }
    38 
    39     private static void print(char[][] table) {
    40         for (int i = 0; i < 9; i++) {
    41             System.out.println(new String(table[i]));
    42         }
    43     }
    44 
    45     public static void main(String[] args) {
    46         Scanner sc = new Scanner(System.in);
    47         char[][] table = new char[9][9];
    48         for (int i = 0; i < 9; i++) {
    49             table[i] = sc.nextLine().toCharArray();
    50         }
    51         dfs(table, 0, 0);
    52     }
    53 }
  • 相关阅读:
    linux centos 8 为.net core 添加进程守护 Supervisor
    vue-quill-editor安装及使用:自定义工具栏和自定义中文字体,把字体写在html的style中
    nginx参数
    k8s pod 挂载glusterfs报错
    Vue跨域问题解决
    CSS导航菜单(二级菜单)
    CSS导航菜单(一级菜单)
    微信小程序开发正常,真机预览模式错误
    uniapp获取用户OpenId及用户详情
    uniapp 获取用户手机号
  • 原文地址:https://www.cnblogs.com/z1110/p/12604628.html
Copyright © 2011-2022 走看看