题解 | #Sudoku#

Sudoku

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

  1. 这种填数字的都是回溯。
  2. 可以使用整除的方式然后*法的方式定位到边界。
  3. 最终回溯复原,是指我在本次,所有选择和对应业务都处理完之后(有时候是没法返回true的时候),就复原(此时返回false,因为所有选择都做完了)。
#include<bits/stdc++.h>

using namespace std;


bool check(vector<vector<int>> res, int i, int j){
    //同行
    for(int k = 0; k< 9;k++){
        if(res[i][j]==res[i][k]&&j!=k){
            return false;
        }
    }

    //同列
    for(int k = 0; k< 9;k++){
        if(res[i][j]==res[k][j]&&i!=k){
            return false;
        }
    }

    //3x3区域
    int top = i/3*3;
    int left = j/3*3;

    for(int t = top; t<top+3;t++ ){
        for(int l = left; l < left+3;l++){

            if((t!=i||l!=j)&&res[i][j]==res[t][l]){
                return false;
            }

        }
    }

    return true;


}




bool DFS(vector<vector<int>>& res, int i, int j){
    //base case
    if(i==9){//全部遍历完成
        return true;
    }


    //入口
    if(res[i][j]==0){

        for(int k = 1; k<=9; k++){
            res[i][j] = k;
            if(check(res,i,j)&&DFS(res, j==8? i + 1:i,  j==8? 0:j+1)){//从左到右,从上到下进行尝试
                return true;
            }

        }

        res[i][j] = 0;//尝试完成之后
        return false;
    }else{
        return DFS(res, j==8? i + 1:i,  j==8? 0:j+1);//就看下一步
    }

}



int main(){

    vector<vector<int>> res(9, vector<int>(9,0));

    int a =0;
    for(int i=0; i< 9; i++){
        for(int j=0; j< 9; j++){
            cin>>a;
            res[i][j] = a;
        }
    }

    DFS(res,0,0);

    for(int i=0; i< 9; i++){
        for(int j=0; j< 9; j++){
            if(j!=8){
                cout<<res[i][j]<<" ";
            }else{
                cout<<res[i][j]<<endl;
            }

        }

    }


    return 0;
}
大厂笔试题题解 文章被收录于专栏

主要是公司笔试题得一些总结

全部评论

相关推荐

多多啊&nbsp;多多啊&nbsp;上来四道算法题算法题直播排序,整体比较简单把对象写出来,然后比较规则写明白就OK了。唯一一道A100%的电车充电如何最省钱,到目的地如何充电的钱最少,路上有充电站,每个电站价格不一样。用了DP来做,但感觉是贪心的样子,最后没招了,把不能到的情况给干了出来,过了8%日志分析纠错,滑动窗口,但我最后结果永远少一,过了15%没看,力竭了燃尽了多多&nbsp;以后牛客不用后台找我了,笔试夯爆了
淮竹c:不好意思,打扰大家🙏我是一个拼多多骑手,小电驴的最大电量为C,我的最大电量有1e9这么promax😭😭😭需要从x=0处走到x=L,L足足有1e9那么长处,途中有n个充电站,🙏🙏每个充电站的距离和电价分别为di和pi,初始电量是满的😭😭😭请告诉我到达终点最少要花多少钱😭😭😭求求大家把这些钱转给我
查看2道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务