37. Sudoku Solver

来源:互联网 发布:mac 隐藏dock 快捷键 编辑:程序博客网 时间:2024/05/16 02:09

题目: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.


思路:

回溯法尝试所有解。如果遇到的是空白,即“.””,就从1-9之间逐个尝试,每尝试一个数,检查这个值所在的行是否符合,检查这个值所在的列是否符合,同时检查这个值所在的

那个九宫格是否符合(int m=v/3*3; int n=h/3*3,因此m和n是这个九宫格的第一个格子)。


注意:只有正确达到最终81位置(即成功填充)的填充结果才可以返回,若不然,将会得到错误的填充。

因此辅助函数solve需要设为bool而不是void


代码:

bool check(char** board,int p);bool resolve(char** board,int p);void solveSudoku(char** board, int boardRowSize, int boardColSize) {    //printf("The v is %d, the h is %d\n",boardRowSize,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;    }        //printf("The v is %d,the h is %d\n",v,h);    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
原创粉丝点击