leetcode 37. 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.

题目大意:

填充数独。要求每行每列每个小九宫格不能有相同的数字。

题目思路:

回溯法填数独。一直到格子全部填满p==81才返回true。

AC代码:


bool check(char** board,int p);
bool resolve(char** board,int p);

void solveSudoku(char** board, int boardRowSize, int boardColSize) {
       resolve(board,0);
}


bool resolve(char** board,int p)
{
    if(p==81) //一定要放在第一行,因为如果等于81的时候,就是第9行超出board的行列,会出现runtime error
        return true;
        
    int i=0;
    int v=p/9;
    int h=p%9;
    char target=board[v][h];
    if(target == '.')
    {
        for(i=1;i<=9;i++) //存放的数字是1-9
        {
            board[v][h]=i+'0';
            if( check(board,p))
                if(resolve(board,p+1) )
                    return true;
            board[v][h]='.';
        }
    
    }
    else
    {
        if( resolve(board,p+1) )
            return true;
    }
    return false; 
}

bool check(char** board,int p)
{
    int v=p/9;
    int h=p%9;
    char target=board[v][h];
    
    for(int i=0;i<9;i++)
    {
        if( (h != i) && (board[v][i] == target) ) return false;
        if( (v != i) && (board[i][h] == target) ) return false;
    }
    
        int r=v/3*3;
        int c=h/3*3;
        
        for(int m=r;m<r+3;m++)
            for(int n=c;n<c+3;n++)
            {
                if((m != v && n != h) && (target == board[m][n]) )
                {
                    return false;
                }
            }
    
    return true;
    
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值