题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

#include <iostream>
using namespace std;
#include <vector>

// 填入新数有效性检查
bool isValid(const vector<vector<int>>& board, int i, int j, int num) {
    for (int a = 0; a < 9; a++) {
        if (board[a][j] == num) {
            return false;
        }
    }
    for (int a = 0; a < 9; a++) {
        if (board[i][a] == num) {
            return false;
        }
    }

    int r = (i / 3) * 3;
    int c = (j / 3) * 3;
    for (int a = r; a < r + 3; a++) {
        for (int b = c; b < c + 3; b++) {
            if (board[a][b] == num) {
                return false;
            }
        }
    }
    return true;
}

bool backtracking(vector<vector<int>>& board) {
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (board[i][j] == 0) {
                for (int k = 1; k <= 9; k++) {
                    if (isValid(board, i, j, k)) {
                        board[i][j] = k;
                        bool result = backtracking(board);
                        if (result) {
                            return true;
                        }
                        board[i][j] = 0;
                    }
                }
                return false;
            }
        }
    }
    return true;
}

int main() {
    vector<vector<int>> board(9, vector<int>(9, 0));
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cin >> board[i][j];
        }
    }
    backtracking(board);
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cout << board[i][j] << " ";
        }
        cout << endl;
    }
}

代码其实不难~

附上数独问题的笔记

2 解数独

2.1 数独概念

  • 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。求填满空格的一个方案(只找到一个符合的叶子节点即刻返回,用bool作返回值)
  • 比N皇后问题多一个维度

2.2 2维递归(2 for 循环)

bool backtracking(board){for (int i = 0; i < board.size(); i++)
{
    for (int i = 0; i < board.size(); i++)
	{
    	for (int j = 0; j < board[0].size(); j++)
    	{
        	if (board[i][j] == 0) // 为空时
        	{
            	for (char k = '1'; k <= '9'; k++)
            	{
                	if (isValid(i, j, k, board))
                	{ // 检查合法性
                    	board[i][j] = k;
                    	bool result = backtracking(board); 
                    	if (result)
                    	{
                        	return true;
                    	}
                    // 回溯
                    	board[i][j] = 0;
                	}
            	}
            // 9数都不合法,返回错
            return false;
        	}
    	}
	}
	return true;
}



华为机试刷题记录 文章被收录于专栏

记录一下手打代码的解题思路方便复习

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11367次浏览 96人参与
# 你的实习产出是真实的还是包装的? #
2013次浏览 42人参与
# MiniMax求职进展汇总 #
24198次浏览 310人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7684次浏览 43人参与
# 简历第一个项目做什么 #
31788次浏览 343人参与
# 重来一次,我还会选择这个专业吗 #
433634次浏览 3926人参与
# 米连集团26产品管培生项目 #
6102次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187253次浏览 1122人参与
# 牛客AI文生图 #
21456次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152506次浏览 888人参与
# 研究所笔面经互助 #
118983次浏览 577人参与
# 简历中的项目经历要怎么写? #
310452次浏览 4223人参与
# AI时代,哪些岗位最容易被淘汰 #
63971次浏览 832人参与
# 面试紧张时你会有什么表现? #
30527次浏览 188人参与
# 你今年的平均薪资是多少? #
213187次浏览 1039人参与
# 你怎么看待AI面试 #
180244次浏览 1261人参与
# 高学历就一定能找到好工作吗? #
64345次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76600次浏览 374人参与
# 我的求职精神状态 #
448210次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363606次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160707次浏览 1112人参与
# 校招笔试 #
471441次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务