题解 | #Sudoku#

Sudoku

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

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

const int N = 9;
int  arrVect[N][N];
bool flag = false;

/*检测当前的值是否满足需求*/
bool check(int row, int col, int val) {
    // 同行不能出现重复
    for(int i = 0; i < 9; i++) {
        if(arrVect[row][i] == val) {
            return false;
        }
    }
    // 同列不能出现重复
    for(int i = 0; i < 9; i++) {
        if(arrVect[i][col] == val) {
            return false;
        }
    }
    
    //同一个9宫格不能出现重复
    int threeRow = row / 3 * 3 + 3; // 输入0~2,输出为3,输入3,输出6
    int threeCol = col / 3 * 3 + 3;
    for(int i = threeRow - 3; i < threeRow; i++) {
        for(int j = threeCol - 3; j < threeCol; j++) {
            if (arrVect[i][j] == val) {
                return false;
            }
            
        }
    }
    return true;
}
/*
思路:将9*9二维数组隔离成3*3的二维数组,若查找是含有0且1-9缺少的值,其值替换0。把3*3的二维数组重新组合9*9数组
*/
void DFS(int row, int col)
{
    if(col == 9) { //列的末尾,重现起一行
        row++;
        col = 0;
    }
    if(row == 9 && col == 0) { //遍历结束
        flag = true;
        return;
    }
    if(arrVect[row][col] == 0) {
        for(int i = 1; i <= 9; i++) {
            if(check(row, col, i)) {
                arrVect[row][col] = i;
                DFS(row, col + 1);
                if(flag) { //已经找到答案,直接返回
                    return;
                }
                 arrVect[row][col]  = 0; //没有查找到,回溯
            }
        }
    } else {
        DFS(row, col + 1);
    }
}

int main()
{
    int n = 9;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            cin>>arrVect[i][j];
        }
    }
    DFS(0, 0); //坐标起点
    
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            cout<<arrVect[i][j]<< ' ';
        }
        cout<<endl;
    }
}

全部评论

相关推荐

投递拼多多等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务