LintCode 802数独(バック)/ LeetCode 37.だけでは停止します

1.トピック

空のセルを充填することにより、数独パズルを解くプログラムを書きます。
空のユニットは、数字0で表されます。
あなたは唯一のユニークなソリューションを考えることができます。
ここに画像を挿入説明
同様の問題は、int型の文字に、37をLeetCode、注目変換

2.問題解決

  • 1-9行のみ、列、9つの小さなグリッドに一度現れます
  • 暴力バックは、座標変換
class Solution {
    vector<vector<int>> ans;
public:
    void solveSudoku(vector<vector<int>> &b) {
        dfs(b,0);
        b = ans;
    }
    
    void dfs(vector<vector<int>> &b, int idx)
    {
        if(idx > 80)
        {
            ans = b;
            return;
        }
        int i = idx/9, j = idx%9;//idx是序号,转换成行列标号
        if(b[i][j] != 0)
            dfs(b,idx+1);//数字是已给的,跳过
        else
        {
            for(int k = 1; k <= 9; ++k)
            {	//遍历9个数字
                if(isok(b,i,j,k))
                {	//数字 k 在当前格子合法
                    b[i][j] = k;
                    dfs(b,idx+1);
                    b[i][j] = 0;
                }
            }
        }
    }
    
    bool isok(vector<vector<int>> &b, int i, int j, int& num)
    {	
        int box_i, box_j;
        box_i = i/3, box_j = j/3;//行列坐标算出小9宫格的坐标
        for(int k = 0; k < 9; ++k)
        {	//遍历9个格子,行的,列的,9 宫格内的,都不能出现过 num
            if(b[i][k]==num || b[k][j]==num || b[box_i*3+k/3][box_j*3+k%3]==num)
                return false;
        }
        return true;
    }
};

試験データの100%
総時間273ミリ秒
、あなたの提出は、55.71パーセントの提出を破りました!

737元記事公開 ウォンの賞賛866 ビューに25万+を

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/104944124