碰到的第一个题就是九宫格的问题,
Valid Sudoku
determine if a Sudoku is valid, according to: http://sudoku.com.au/TheRules.aspx
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.‘
.
注意这里合法的九宫格的定义是:
在横行上只出现1-9的数字,且每个数字只能出现1次,在纵行上也一样。
同时9*9宫格中的9个3*3的子宫格中也只能出现在1-9中,且出现一次。
只要明白了合法九宫格的定义,代码写起来就很清晰了。
先判断横行,在判断总行,再判断那9个子宫格,判断的方法是:使用数组作为hash table. 没出现一个数字,将对应的数组中的元素个数加1,
起始为0,所以合法的九宫格不应该出现有数组元素>1的情况。
/*--------------------------九宫格问题-------------------------------*/ //By Lingtao 2015/04/21 bool isValidSudoku(vector<vector<char> > &board) { int number[9]; //hash table memset(number, 0, sizeof(number)); //初值全为0 //判断横向是否满足。 for (int i = 0; i < 9;i++) { for (int j = 0; j < 9;j++) { if (!isdigit(board[i][j]) && board[i][j] != '.') //判断输入是否合法。这里可能不用判断 return false; else if (board[i][j] != '.') { if (++number[board[i][j] - '0' - 1]> 1) return false; } } memset(number, 0, sizeof(number)); } //判断纵向。 for (int j = 0; j < 9; j++) { memset(number, 0, sizeof(number)); for (int i = 0; i < 9; i++) { if (board[i][j] != '.') if (++number[board[i][j]-'0'-1]> 1) return false; } } //判断sub-九宫。 int num[9]; memset(num, 0, sizeof(num)); for (int i = 0; i < 9; i += 3) { for (int j = 0; j < 9; j += 3) { for (int k = 0; k < 3; k++) { for (int k_j = 0; k_j < 3; k_j++) { if (board[i + k][j + k_j] != '.') if (++num[board[i + k][j + k_j] - '0' - 1]>1) return false; } } memset(num, 0, sizeof(num)); } } return true; }
未完待续。
时间: 2024-10-08 03:49:35