golang_算法: leetcode_数组10-有效的数独

本文介绍如何使用Golang解决LeetCode上的数组问题,聚焦于验证一个数独是否有效,探讨算法思路和代码实现。
摘要由CSDN通过智能技术生成
package main

import "fmt"

/*
有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

说明:

一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 '.' 。
给定数独永远是 9x9 形式的。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2f9gg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
func main() {
	board := [][]byte{
		{'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'},
	}
	sudoku := isValidSudoku(board)
	fmt.Println(sudoku)
}

func isValidSudoku(board [][]byte) bool {
	for i := 0; i < 9; i++ {
		m1 := make(map[byte]bool)
		m2 := make(map[byte]bool)
		m3 := make(map[byte]bool)
		fmt.Printf("i: %d, num[i]: %v\n", i, board[i])

		// 判断每一行是否重复
		for j := 0; j < 9; j++ {
			if board[i][j] != '.' {
				fmt.Printf("j1: %d, num[j]: %v\n", j, board[i][j])
				if m1[board[i][j]] {
					return false
				}
				m1[board[i][j]] = true
			}

			// 判断每一列是否重复
			if board[j][i] != '.' {
				fmt.Printf("j2: %d, num[j]: %v\n", j, board[j][i])
				if m2[board[j][i]] {
					return false
				}
				m2[board[j][i]] = true
			}

			// 判断9宫格内的数据是否重复
			row := (i%3)*3 + j%3
			col := (i/3)*3 + j/3
			if board[row][col] != '.' {
				fmt.Printf("j3: %d, num[j]: %v\n", j, board[row][col])
				if m3[board[row][col]] {
					return false
				}
				m3[board[row][col]] = true
			}
		}
	}
	return true
}

Output:

01-数组 git:(master)go run 10-有效的数独.go
i: 0, num[i]: [53 51 46 46 55 46 46 46 46]
j1: 0, num[j]: 53
j2: 0, num[j]: 53
j3: 0, num[j]: 53
j1: 1, num[j]: 51
j2: 1, num[j]: 54
j3: 1, num[j]: 54
j2: 3, num[j]: 56
j3: 3, num[j]: 51
j1: 4, num[j]: 55
j2: 4, num[j]: 52
j2: 5, num[j]: 55
j3: 5, num[j]: 57
j3: 8, num[j]: 56
i: 1, num[i]: [54 46 46 49 57 53 46 46 46]
j1: 0, num[j]: 54
j2: 0, num[j]: 51
j3: 0, num[j]: 56
j3: 1, num[j]: 52
j2: 2, num[j]: 57
j3: 2, num[j]: 55
j1: 3, num[j]: 49
j1: 4, num[j]: 57
j1: 5, num[j]: 53
j2: 6, num[j]: 54
i: 2, num[i]: [46 57 56 46 46 46 46 54 46]
j1: 1, num[j]: 57
j1: 2, num[j]: 56
j2: 2, num[j]: 56
j3: 3, num[j]: 54
j1: 7, num[j]: 54
i: 3, num[i]: [56 46 46 46 54 46 46 46 51]
j1: 0, num[j]: 56
j2: 1, num[j]: 49
j3: 1, num[j]: 49
j3: 3, num[j]: 55
j1: 4, num[j]: 54
j2: 4, num[j]: 56
j3: 4, num[j]: 57
j2: 7, num[j]: 52
j3: 7, num[j]: 53
j1: 8, num[j]: 51
i: 4, num[i]: [52 46 46 56 46 51 46 46 49]
j1: 0, num[j]: 52
j2: 0, num[j]: 55
j2: 1, num[j]: 57
j3: 1, num[j]: 56
j1: 3, num[j]: 56
j2: 3, num[j]: 54
j3: 3, num[j]: 54
j1: 5, num[j]: 51
j2: 5, num[j]: 50
j3: 5, num[j]: 50
j2: 7, num[j]: 49
j3: 7, num[j]: 51
j1: 8, num[j]: 49
j2: 8, num[j]: 56
i: 5, num[i]: [55 46 46 46 50 46 46 46 54]
j1: 0, num[j]: 55
j2: 1, num[j]: 53
j3: 1, num[j]: 52
j1: 4, num[j]: 50
j2: 4, num[j]: 51
j3: 4, num[j]: 49
j3: 5, num[j]: 56
j2: 7, num[j]: 57
j3: 7, num[j]: 57
j1: 8, num[j]: 54
i: 6, num[i]: [46 54 46 46 46 46 50 56 46]
j1: 1, num[j]: 54
j3: 5, num[j]: 54
j1: 6, num[j]: 50
j2: 6, num[j]: 50
j1: 7, num[j]: 56
i: 7, num[i]: [46 46 46 52 49 57 46 46 53]
j2: 2, num[j]: 54
j1: 3, num[j]: 52
j1: 4, num[j]: 49
j1: 5, num[j]: 57
j2: 6, num[j]: 56
j3: 6, num[j]: 51
j3: 7, num[j]: 49
j1: 8, num[j]: 53
j2: 8, num[j]: 55
j3: 8, num[j]: 54
i: 8, num[i]: [46 46 46 46 56 46 46 55 57]
j3: 0, num[j]: 50
j2: 3, num[j]: 51
j3: 3, num[j]: 56
j1: 4, num[j]: 56
j2: 4, num[j]: 49
j2: 5, num[j]: 54
j3: 5, num[j]: 55
j1: 7, num[j]: 55
j2: 7, num[j]: 53
j3: 7, num[j]: 53
j1: 8, num[j]: 57
j2: 8, num[j]: 57
j3: 8, num[j]: 57
true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值