【無聊刷題】leetCode之解數獨
阿新 • • 發佈:2019-02-09
題意:解數獨,空缺的方格用.表示。
解法:就是典型的回溯法,用row[i][j],column[i][j],grid[i][j]表示i行,i列,i格j是否用。用flag表示當前是否有解。若有解,則不用再遞迴下去。可能是leetCode裡Hard的題目當中最簡單的一題了。
程式碼:
class Solution { public: int row[9][10]; int column[9][10]; int grid[9][10]; int flag=0; void solve(int r,int c,vector<vector<char>>& board) { int i; if(r==9) { flag=1; return; } if(board[r][c]=='.') { for(i=1;i<=9;i++) { if(row[r][i]==0&&column[c][i]==0&&grid[3*(r/3)+c/3][i]==0) { board[r][c]=i+'0'; row[r][i]=1; column[c][i]=1; grid[3*(r/3)+c/3][i]=1; if(c==8) solve(r+1,0,board); else solve(r,c+1,board); if(flag==1) return; board[r][c]='.'; row[r][i]=0; column[c][i]=0; grid[3*(r/3)+c/3][i]=0; } } } else { if(c==8) solve(r+1,0,board); else solve(r,c+1,board); } } void solveSudoku(vector<vector<char>>& board) { int i,j,k; for(i=0;i<9;i++) { for(j=0;j<10;j++) row[i][j]=column[i][j]=grid[i][j]=0; } for(i=0;i<9;i++) { for(j=0;j<9;j++) { if(board[i][j]!='.') { k=board[i][j]-'0'; row[i][k]=1; column[j][k]=1; grid[(i/3)*3+j/3][k]=1; } } } solve(0,0,board); } };