type Parser struct { Matrix [9][9]int Rows [9][9]bool Cols [9][9]bool Blocks [9][9]bool Stop bool } func (p *Parser) Init(matrix [9][9]int) { p.Matrix = matrix p.Rows = [9][9]bool{} p.Cols = [9][9]bool{} p.Blocks = [9][9]bool{} for i, line := range matrix { for j, num := range line { if num == 0 { continue } p.Add(i, j, num) } } } func (p *Parser) Add(i, j, num int) { p.Rows[i][num-1] = true p.Cols[j][num-1] = true p.Blocks[convertPosition2BlockID(i, j)][num-1] = true p.Matrix[i][j] = num } func (p *Parser) Delete(i, j int) { num := p.Matrix[i][j] p.Rows[i][num-1] = false p.Cols[j][num-1] = false p.Blocks[convertPosition2BlockID(i, j)][num-1] = false p.Matrix[i][j] = 0 } func (p *Parser) PosStatus(i, j int) [9]bool { status1 := p.Rows[i] status2 := p.Cols[j] status3 := p.Blocks[convertPosition2BlockID(i, j)] res := [9]bool{} for i := 0; i < 9; i++ { res[i] = status1[i] || status2[i] || status3[i] } return res } func (p *Parser) Parse(seq int) { if p.Stop { return } if seq == 81 { p.Stop = true return } i, j := seq/9, seq%9 if p.Matrix[i][j] != 0 { p.Parse(seq + 1) return } // dfs + 回溯 for num, ok := range p.PosStatus(i, j) { if ok { continue } p.Add(i, j, num+1) p.Parse(seq + 1) if p.Stop { return } p.Delete(i, j) } } func convertPosition2BlockID(i, j int) int { bRow, bCol := i/3, j/3 return bRow*3 + bCol }
golang数独问题
最新推荐文章于 2024-08-08 19:35:54 发布