题解 | #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;
}



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

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

全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
13285次浏览 128人参与
# AI面会问哪些问题? #
779次浏览 18人参与
# 米连集团26产品管培生项目 #
6809次浏览 222人参与
# 你的实习产出是真实的还是包装的? #
2363次浏览 47人参与
# AI时代,哪个岗位还有“活路” #
2443次浏览 47人参与
# 长得好看会提高面试通过率吗? #
2207次浏览 39人参与
# 巨人网络春招 #
11453次浏览 224人参与
# 你做过最难的笔试是哪家公司 #
980次浏览 18人参与
# HR最不可信的一句话是__ #
874次浏览 31人参与
# 沪漂/北漂你觉得哪个更苦? #
859次浏览 28人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7883次浏览 43人参与
# XX请雇我工作 #
51096次浏览 171人参与
# 简历中的项目经历要怎么写? #
310725次浏览 4245人参与
# 简历第一个项目做什么 #
31944次浏览 353人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152716次浏览 888人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187473次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64356次浏览 855人参与
# 如果重来一次你还会读研吗 #
229933次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364010次浏览 2640人参与
# 腾讯音乐求职进展汇总 #
160790次浏览 1114人参与
# 你怎么看待AI面试 #
180504次浏览 1286人参与
# 投格力的你,拿到offer了吗? #
178015次浏览 889人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务