判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出: true
示例 2:
输入:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 '.' 。
给定数独永远是 9x9 形式的。
就是按照题意 , 来校验是否满足3个条件 ,有2个需要注意的地方,
校验的时候可以借助hash表来优化,也可以生9个桶,有数据就放进去,无数据就是0, 这样的读写操作都是O(1), (还有人用位运算优化的,好吧.)
求解3*3的小方格,需要稍微观察一下,找下规律.
#import <Foundation/Foundation.h>
// 测试用例1 , 是数独
char board1[9][9] = {
{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','4','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}
};
// 测试用例2 , 横向不合法
char board2[9][9] = {
{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','1','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}
};
// 测试用例3 , 纵向不合法
char board3[9][9] = {
{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','9','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'4','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','4','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}
};
// 测试用例4 , 小方格不合法
char board4[9][9] = {
{'5','3','.','.','7','.','.','.','.'},
{'6','.','.','1','9','5','.','.','.'},
{'.','6','8','.','.','.','.','6','.'},
{'8','.','.','.','6','.','.','.','3'},
{'4','.','.','8','.','3','.','.','1'},
{'7','.','.','.','2','.','.','.','6'},
{'.','6','.','.','.','.','2','8','.'},
{'.','.','.','4','1','9','.','.','5'},
{'.','.','.','.','8','.','.','7','9'}
};
BOOL checkBoard(char board[9][9]) {
NSMutableArray <NSMutableDictionary *>* xArray = [NSMutableArray array];
NSMutableArray <NSMutableDictionary *>* yArray = [NSMutableArray array];
NSMutableArray <NSMutableDictionary *>* boxArray = [NSMutableArray array];
for (int i = 0; i<9; i++) {
NSMutableDictionary * xDic = [NSMutableDictionary dictionary];
[xArray addObject:xDic];
NSMutableDictionary * yDic = [NSMutableDictionary dictionary];
[yArray addObject:yDic];
NSMutableDictionary * boxDic = [NSMutableDictionary dictionary];
[boxArray addObject:boxDic];
}
for (int y = 0; y<9; y++) {
for (int x = 0; x<9; x++) {
char item = board[y][x];
if (item == '.') {
continue;
}
NSString * key = [NSString stringWithFormat:@"%c",item];
// 检测横向
NSMutableDictionary * xDic = xArray[x];
if (xDic[key] != nil) {
return NO;
}
xDic[key] = key;
// 检测竖向
NSMutableDictionary * yDic = yArray[y];
if (yDic[key]!=nil) {
return NO;
}
yDic[key] = key;
// 检测小方格
int boxIndex = y/3*3+x/3;
NSMutableDictionary * boxDic = boxArray[boxIndex];
if (boxDic[key] != nil) {
return NO;
}
boxDic[key] = key;
}
}
return YES;
}
int main(){
NSLog(@"数独是否有效 -- %d",checkBoard(board1));
NSLog(@"数独是否有效 -- %d",checkBoard(board2));
NSLog(@"数独是否有效 -- %d",checkBoard(board3));
NSLog(@"数独是否有效 -- %d",checkBoard(board4));
}