这道题简直是耻辱啊,居然被吓得不敢做,终于开始写还犯下了各种低级错误,花了好久的时间。
其实如果想明白81*9其实是很小的规模的话,早就想到用回溯法了,这不是跟八皇后完全一样的嘛。每次填入的时候,验证一下合不合理,其中合不合理在上一个问题中已经讨论过了,对当前位置讨论更简单。
所的头头是道,你会问“那你是错在哪呢?”你猜啊。我在判断一个小方格时候合理时,走了很多弯路。一开始想的是用循环和减法,找到当前位置所在的小方格最左上角的位置。其实完全不用啊亲,当听到实验室的同学说3*(i/3)和3*(j/3)直接就是时,我眼泪都掉下来了,蠢爆了。还有,在判断board上的字符等不等于当前字符p时,我居然写出了board[i][j]==‘p‘这种惊天地泣鬼神的代码,给自己跪了。p传进去的就是字符格式了,在数独的棋盘上到哪找等于‘p’的位置啊。。
class Solution { public: int MAX = 9; bool flag = false; bool isValide(vector<vector<char> > &board, char p, int i, int j){ for(int k=0;k<MAX;k++){ if(board[i][k] == ‘.‘) continue; if(k!=j&&board[i][k] == p) return false; } for(int k=0;k<MAX;k++){ if(board[k][j] == ‘.‘) continue; if(k!=i&&board[k][j] == p) return false; } int refi = 3*(i/3), refj = 3*(j/3); for(int m=refi;m<refi+3;m++){ for(int n=refj;n<refj+3;n++){ if(m==i && n==j) continue; if(board[m][n] == ‘.‘) continue; if(board[m][n] == p) return false; } } return true; } void fileSudo(vector<vector<char> > &board, int pos){ if(pos == 81) {flag = true; return;} int i=pos/MAX, j=pos%MAX; if(isdigit(board[i][j])){ fileSudo(board, pos+1); }else{ for(char p=‘1‘;p<=‘9‘;p++){ //cout<<i<<" "<<j<<" "<<p<<endl; if(isValide(board, p, i, j)){ board[i][j] = p; //cout<<"nice p:"<<p<<endl; fileSudo(board, pos+1); if(flag) return; } } board[i][j] = ‘.‘; } } void solveSudoku(vector<vector<char> > &board) { fileSudo(board, 0); } };
leetcode第一刷_Sudoku Solver,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u012792219/article/details/25745841