• leetcode problem 37 -- Sudoku Solver


    解决数独

    Write a program to solve a Sudoku puzzle by filling the empty cells.

    Empty cells are indicated by the character '.'.

    You may assume that there will be only one unique solution.


    A sudoku puzzle...


    思路:

      搜索加剪枝。

      首先设立3个辅助二维数组:rows,  columns, grids来维护目前的数独状态,rows[i][k](1<=i, k<=9)表示第i行是否占用了数字k,同理colums[i][k]表示第i列是否占用了数字k,grid[i][k]表示第i个格子是否占用了数字k,

      然后第一次读入二维数组,更新rows, columns和grids.

      第二次读二维数组,对每个为'.'的元素根据rows,columns和grid来枚举可能的值。如果没有可以枚举的值,直接剪枝返回。

    代码如下:

      Runtime: 5 ms

    static int columns[9][10];
    static int rows[9][10];
    static int grids[9][10];
    
    
    int search(char *board[9], int startI, int startJ) {
    
        for(int i = startI; i < 9; ++i) {
            for(int j = i == startI ? startJ : 0; j < 9; ++j) {
                if (board[i][j] == '.') {
                    for (int k = 1; k <= 9; ++k) {
                        if (!rows[i][k] && !columns[j][k] && !grids[i/3 + j/3 *3][k]) {
                            rows[i][k] = 1;
                            columns[j][k] = 1; 
                               grids[i/3 + j/3 *3][k] = 1;
    
                            if (search(board, i, j+1) == 1) {
                                board[i][j] = k + '0';
                                return 1;
                            }
                            rows[i][k] = 0;
                            columns[j][k] = 0; 
                               grids[i/3 + j/3 *3][k] = 0;
                        }
                    }
                    return 0;
                }
            }
        }
        return 1;
    }
    
    
    void solveSudoku(char * board[9]) {
        memset(columns, 0, sizeof(columns));    
        memset(rows, 0, sizeof(rows));    
        memset(grids, 0, sizeof(grids));    
    
        for(int i = 0; i < 9; ++i) {
            for(int j = 0; j < 9; ++j) {
                if (board[i][j] != '.') {
                    rows[i][board[i][j] - '0'] = 1;
                    columns[j][board[i][j] - '0'] = 1;
    
                    int tmp = i/3 + j/3 * 3; 
                    grids[tmp][board[i][j] - '0'] = 1;
                }
            }
        }
        search(board, 0, 0);
    }
  • 相关阅读:
    DB9 ------ 接口定义
    以太网 ------ Auto-Negotiation(自动协商)
    Qt ------ 添加某个功能,比如(QSerialPort)注意事项
    Modbus
    Centos7.5 安装JDK1.8 步骤
    Kafka 消息中间件
    使用RabbitMQ实现分布式事务
    RabbitMq的环境安装
    RabbitMQ消息中间件的用法
    基于Docker+Jenkins实现自动化部署
  • 原文地址:https://www.cnblogs.com/lysuns/p/4454036.html
Copyright © 2020-2023  润新知