题解 | #Sudoku#

Sudoku

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

#include <stdio.h>
#include <stdbool.h>
void printsudo(int sudo[9][9]) {
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if(j != 8) printf("%d ", sudo[i][j]);
            else printf("%d", sudo[i][j]);
        }
        printf("\n");
    }
}
// 输入分别是,数独盘面,所在行数列数和填充的数字
bool checknumvalid(int sudo[9][9], int row, int col, int num) {
    // 先检查行
    for(int i = 0; i < 9; i++) {
        if(sudo[row][i] == num) return false;
    }

    // 然后检查列
    for(int i = 0; i < 9; i++) {
        if(sudo[i][col] == num) return false;
    }

    // 检查所在九宫格

    int startrow = row - row % 3;
    int startcol = col - col % 3;
    for(int i = startrow; i < startrow + 3; i++) {
        for(int j = startcol; j < startcol + 3; j++) {
            if(!(i == row && j == col)) {
                if(sudo[i][j] == num) return false;
            }
        }
    }

    return true;
}

bool solvesudo(int sudo[9][9]) {
    for(int i = 0; i < 9; i++) {
        for(int j = 0; j < 9; j++) {
            if(sudo[i][j] == 0) {
                for(int k = 1; k <= 9; k++) {
                    // printf("for %d,%d trying number %d\n", i, j, k);
                    if(checknumvalid(sudo, i, j, k)) {
                        sudo[i][j] = k;
                        if(solvesudo(sudo)) return true;
                        // 如果填充的数字不能实现数独的全解,回复为0方便寻找下一个数字
                        else sudo[i][j] = 0;
                    }
                }
                return false;
            }
        }
    }
    return true;
}

int main () {
    int sudoku[9][9];
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            scanf("%d", &sudoku[i][j]);
        }
    }
    if(solvesudo(sudoku)) {
        printsudo(sudoku);
    }
    return 0;
}

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务