检查数独是否有效

判断一个 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的小方格,需要稍微观察一下,找下规律.

image.png

#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));
    
}
 
发布了101 篇原创文章 · 获赞 33 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/u014600626/article/details/104104702