力扣(36.37)补7.23

发布于:2023-01-04 ⋅ 阅读:(269) ⋅ 点赞:(0)

36.有效的数独

看答案罢,就是遍历board,row(i,num)=1代表第i行的数字num已有,col(j,num)=1代表第j列的num已有,box[(i/3)*3+j/3][num]代表下标为(i/3)*3+j/3的九字格中已有num。

答案很easy,🥚唔想不到。

37.解数独

相当于有几个位置,让你从1-9选个数字去填,但要满足if条件(该行,该列,该九宫格都没这个数)才能填上数字。

思路也好理解,就是麻饭且难想到,毕竟有四个数组。另外就是全局变量尽量不要直接复制,要不然显示各种错误,比如测试时各种用例没问题,提交显示却只能通过一个,奇怪。

int box[3][3][10];

记录一个九宫格的数是否已有,九宫格看成了一个一维数组。

int row[9][10];

int col[9][10];

int *b[81];

记录缺少数的格子的坐标。

bool ans;

int bsize;

记录一开始数独缺多少个数。

void dfs(char**board,int pos){

pos是指已填了几个数

    if(bsize==pos){

    ans=true;

    return;}

    int i=b[pos][0],j=b[pos][1];

    for(int k=1;k<10&&ans!=true;k++){

        if(!row[i][k]&&!col[j][k]&&!box[i/3][j/3][k]){

            board[i][j]=k+'0';

字符转化为数字。

            row[i][k]=col[j][k]=box[i/3][j/3][k]=1;

            dfs(board,pos+1);

            row[i][k]=col[j][k]=box[i/3][j/3][k]=0;

        }

    }

}

void solveSudoku(char** board, int boardSize, int* boardColSize){

    memset(box,0,sizeof(box));

     memset(row,0,sizeof(row));

    memset(col,0,sizeof(col));

    ans=false;

    bsize=0;

    for(int i=0;i<9;i++){

        for(int j=0;j<9;j++){

            if(board[i][j]=='.'){

                b[bsize]=malloc(sizeof(int)*2);

                b[bsize][0]=i;

                b[bsize++][1]=j;

            }else{

            int num=board[i][j]-'0';

            row[i][num]=col[j][num]=box[i/3][j/3][num]=1;

            }

        }

    }

    dfs(board,0);

}

 

 

 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到