leetcode题集——sudoku-solver

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.

题目的输入保证是有效的。这样用回溯法我们只要检查新加入的值能否在行、列以及小方块里有效即可,没有必要检查整个矩阵。

class Solution {
public:
    //判断某个方格内的值是否能组成数独
    bool IsvalidSudoku(vector<vector<char> > &board,int x,int y)
    {
        int i,j;
       //判断方格(x,y)所在行能否组成数独
      for(j=0;j<9;j++)
      {
         if(j!=y&&board[x][j]==board[x][y])
             return false;
      }
        
      //判断方格(x,y)所在列能否组成数独
      for(i=0;i<9;i++)
      {
         if(i!=x&&board[i][y]==board[x][y])
             return false;
      }
      
      //判断方格(x,y)所在九宫格能否组成数独
       for(i=(x/3)*3;i<(x/3+1)*3;i++)
       {
          for(j=(y/3)*3;j<(y/3+1)*3;j++)
          {
             if(i!=x&&j!=y&&board[i][j]==board[x][y])
                  return false;
          }
       }
      return true;  
    }
    
    //将某个空方格赋值
    bool SolveSudoku(vector<vector<char> > &board)
    {
       int i,j;
       for(i=0;i<9;i++)
       {
          for(j=0;j<9;j++)
          {
             if(board[i][j]=='.')
             {
                for(int k=1;k<=9;k++)
                {
                    board[i][j]='0'+k;//将空格赋值,注意,将整数变为字符;将字符变为整数.
                    if(IsvalidSudoku(board,i,j)&&SolveSudoku(board))
                        return true;//回溯算法,继续遍历其他空方格
                    
                    board[i][j]='.';
                }
                 return false;
             }
          }
       }
        return true;
    }
    void solveSudoku(vector<vector<char> > &board) 
    {
        SolveSudoku(board);
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值