RT:

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

解答数独

A sudoku puzzle...

 

解答数独

...and its solution numbers marked in red.

代码如下:不过有一个前提,有3×3的小方格内也必须满足不能出现相同数字的约定,所以回溯的时候加上了一个g.

    bool s(vector<vector<char> > &n,vector<map<char, int> > & rows, vector<map<char, int> > & clo, int i, int j,vector<map<int, int> >& g)
    {
        for (; i < 9; ++i)
        {
            bool finded = false;
            for (; j < 9; ++j)
            {
                if (n[i][j] == '.')
                {
                    finded = true;
                    break;
                }
            }
            if (finded)
                break;
            j = 0;
        }
        if (i == 9)
            return true;
        vector<char> selects;
        for (char k = '1'; k <= '9'; ++k)
        {
            if (rows[i][k] == 0 && clo[j][k] == 0&& g[((i/3)*3+(j/3))][k] == 0)
            {
                selects.push_back(k);
            }
        }
        if (selects.size() == 0)
            return false;
        reverse(selects.begin(), selects.end());
        for (int h = 0; h < selects.size(); ++h)
        {
            rows[i][selects[h]] = 1;
            clo[j][selects[h]] = 1;
            g[((i/3)*3+(j/3))][selects[h]] = 1;
            n[i][j] = selects[h];
            if (s(n, rows, clo, i + ((j+1)/9), (j + 1)%9,g))
                return true;
            n[i][j] = '.';
            g[((i/3)*3+(j/3))][selects[h]] = 0;
            rows[i][selects[h]] = 0;
            clo[j][selects[h]] = 0;
        }
        return false;
    }
    
    void solveSudoku(vector<vector<char> > &board) 
    {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<map<char, int> > rows, clos;
        rows.resize(9);
        clos.resize(9);
        vector<map<int, int> > g;
        g.resize(9);
        for (int i = 0; i < 9; ++i)
            for (char j = '1'; j <= '9' ; ++j)
            {
                g[i][j] = 0;
                rows[i][j] = 0;
                clos[i][j] = 0;
            }
            
        for (int i = 0; i < 9; ++i)
            for (int j = 0; j < 9; ++j)
            {
                if (board[i][j] != '.')
                {
                    g[((i/3)*3+(j/3))][board[i][j]] = 1;
                    rows[i][board[i][j]] = 1;
                    clos[j][board[i][j]] = 1;
                }
            }
        s(board, rows, clos, 0, 0,g);
    }

  

相关文章:

  • 2021-12-18
  • 2022-03-04
  • 2021-09-27
  • 2021-12-21
  • 2021-06-09
  • 2021-09-21
猜你喜欢
  • 2021-12-09
  • 2021-12-24
  • 2021-04-11
  • 2021-12-24
  • 2021-08-21
  • 2022-01-15
  • 2021-05-12
相关资源
相似解决方案