您的位置:首页 > 其它

leetcode 37. Sudoku Solver

2017-09-03 19:34 288 查看
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]
) )

                {

                    return false;

                }

            }

    

    return true;

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: