《leetcode-go》数独

请编写一个程序,给数独中的剩余的空格填写上数字,保证每一行每一列每一宫都是1-9

空格用字符'.'表示

假设给定的数独只有唯一的解法

思路:第一步遍历找到一个为空的位置,记录他的位置i、j,第二步,记录i、j这个位置对应的行、列和块出现过的数字,第三步,找到没出现过的数字,第四部,把数字填上去然后递归调用。如果有解,就直接返回,如果没有解,把位置填回空格,为什么要把空格再填回去呢?如果不把空格填回去,后面失败再从头开始的时候,就识别不到这些格子是空的了,影响最后结果

package main

/**
 * 
 * @param board char字符型二维数组 
 * @return void
*/
func solveSudoku(board [][]byte) {
	// write code here
	solve1(board)
}

func solve1(board [][]byte) bool {
	hasSlot := false
	i := 0
	j := 0
	for i = 0; i < 9; i++ {
		for j = 0; j < 9; j++ {
			if board[i][j] == '.' {
				hasSlot = true
				break
			}
		}
		if hasSlot {
			break
		}
	}
	if !hasSlot {
		return true
	}
	line := make(map[byte]bool, 9)
	col := make(map[byte]bool, 9)
	piece := make(map[byte]bool, 9)
	for m := 0; m < 9; m++ {
		//一横行
		if board[i][m] != '.' {
			line[board[i][m]] = true
		}
		//一竖列
		if board[m][j] != '.' {
			col[board[m][j]] = true
		}
		//一个9宫块
		p := i / 3
		q := j / 3
		for r := p * 3; r < p*3+3; r++ {
			for s := q * 3; s < q*3+3; s++ {
				if board[r][s] != '.' {
					piece[board[r][s]] = true
				}
			}
		}
	}
	var allNum []int
	for m := 49; m <= 57; m++ {
		if !line[byte(m)] && !col[byte(m)] && !piece[byte(m)] {
			allNum = append(allNum, m)
		}
	}
	for _, k := range allNum {
		byteK := byte(k)
		board[i][j] = byteK
		res := solve1(board)
		if res {
			return true
		}
		board[i][j] = '.'
	}
	return false
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值