题目:就是判断已有的数字是否冲突无效,若无效返回flase 有效返回true 不要求sudo可解
用了char型的数字,并且空格用‘.'来表示的。
思路:只要分别判断横向 竖向 3*3小块中的数字是否有重复或者无效就可以了 就是单纯的麻烦 不难
#include<iostream> #include<vector> using namespace std; class Solution { public: bool isValidSudoku(vector<vector<char> > &board) { vector<int> hash; //纵向判断 for(int c = 0; c < 9; c++) //对每一列判断 { hash.clear(); hash.resize(10); //每次判断前 hash要清零 for(int r = 0; r < 9; r++) { if(board[r][c] == '.') //空白跳过 { continue; } else if(board[r][c] <= '9' && board[r][c] >= '0') //是数字 { if(hash[board[r][c] - '0'] != 0) //若已经有过 无效 { return false; } else { hash[board[r][c] - '0']++; } } else //不是空白 不是数字 无效 { return false; } } } //横向判断 for(int r = 0; r < 9; r++) //对每一行判断 { hash.clear(); hash.resize(10); for(int c = 0; c < 9; c++) { if(board[r][c] == '.') { continue; } else if(board[r][c] <= '9' && board[r][c] >= '0') { if(hash[board[r][c] - '0'] != 0) { return false; } else { hash[board[r][c] - '0']++; } } else { return false; } } } //小矩形判断 hash.clear(); hash.resize(10); for(int r = 0; r < 9; r+=3) //对每一行判断 { for(int c = 0; c < 9; c+=3) { hash.clear(); hash.resize(10); for(int rr = r; rr < r + 3; rr++) { for(int cc = c; cc < c + 3; cc++) { if(board[rr][cc] == '.') { continue; } else if(board[rr][cc] <= '9' && board[rr][cc] >= '0') { if(hash[board[rr][cc] - '0'] != 0) { return false; } else { hash[board[rr][cc] - '0']++; } } else { return false; } } } } } return true; } }; int main() { Solution s; vector<vector<char>> sudo; vector<char> sub; char c; for(int i = 0; i < 9; i++) { sub.clear(); for(int j = 0; j < 9; j++) { scanf("%c ", &c); sub.push_back(c); } sudo.push_back(sub); } bool b = s.isValidSudoku(sudo); return 0; }