dengxinyi %!s(int64=6) %!d(string=hai) anos
pai
achega
0d18abef06
Modificáronse 4 ficheiros con 133 adicións e 15 borrados
  1. 15 15
      hard/25.go
  2. 77 0
      hard/37.go
  3. 32 0
      hard/51.go
  4. 9 0
      hard/helper.go

+ 15 - 15
hard/25.go

@@ -50,18 +50,18 @@ func reverseKGroup(head *ListNode, k int) *ListNode {
 	return head
 }
 
-func main() {
-	// 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
-	n7 := ListNode{7, nil}
-	n6 := ListNode{6, &n7}
-	n5 := ListNode{5, &n6}
-	n4 := ListNode{4, &n5}
-	n3 := ListNode{3, &n4}
-	n2 := ListNode{2, &n3}
-	n1 := ListNode{1, &n2}
-	printList(&n1)
-	printList(reverseKGroup(&n1, 5))
-	// 0
-	n0 := ListNode{0, nil}
-	printList(reverseKGroup(&n0, 1))
-}
+// func main() {
+// 	// 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
+// 	n7 := ListNode{7, nil}
+// 	n6 := ListNode{6, &n7}
+// 	n5 := ListNode{5, &n6}
+// 	n4 := ListNode{4, &n5}
+// 	n3 := ListNode{3, &n4}
+// 	n2 := ListNode{2, &n3}
+// 	n1 := ListNode{1, &n2}
+// 	printList(&n1)
+// 	printList(reverseKGroup(&n1, 5))
+// 	// 0
+// 	n0 := ListNode{0, nil}
+// 	printList(reverseKGroup(&n0, 1))
+// }

+ 77 - 0
hard/37.go

@@ -0,0 +1,77 @@
+package main
+
+const (
+	// ROW ...
+	ROW = iota
+	// COL ...
+	COL
+	// BLOCK ...
+	BLOCK
+)
+
+// Grid ...
+type Grid struct {
+	X   int
+	Y   int
+	Val int
+}
+
+// SudokuMap ...
+type SudokuMap [][]int
+
+func (m SudokuMap) put(area, id, num int) {
+	m[area][id] |= 1 << uint(num)
+}
+
+func (m SudokuMap) del(area, id, num int) {
+	m[area][id] &= (1 << uint(num)) ^ 0x1FF
+}
+
+func solveSudoku(board [][]byte) {
+	var m SudokuMap
+	m = make([][]int, 3)
+	for i := range m {
+		m[i] = make([]int, 9)
+	}
+	for y, row := range board {
+		for x, col := range row {
+			if col == '.' {
+				continue
+			}
+			num := int(col - '0')
+			m.put(ROW, y, num)
+			m.put(COL, x, num)
+			m.put(BLOCK, y/3*3+x/3, num)
+		}
+	}
+	stack := make([]Grid, 0)
+	for y, row := range board {
+		for x, col := range row {
+			if col != '.' {
+				continue
+			}
+			occur := m[ROW][y] & m[COL][x] & m[BLOCK][y/3*3+x/3]
+			bit := 1
+			for i := 0; i < 9; i++ {
+				if bit&occur == 0 { // Is valid
+					stack = append(stack, Grid{x, y, 0})
+				}
+			}
+		}
+	}
+}
+
+func main() {
+	b1 := [][]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'}}
+	solveSudoku(b1)
+	printBoard(b1)
+}

+ 32 - 0
hard/51.go

@@ -0,0 +1,32 @@
+package main
+
+import (
+	"fmt"
+)
+
+func solveNQueens(n int) [][]string {
+	solutions := make([][]string, 0)
+	colNum := make([]int, n)
+	colLaid := make([]bool, n)
+	mainLaid := make([]bool, 2*n) // Range of row-col is [1-n, n-1], so row-col+n -> [1, 2n-1]
+	viceLaid := make([]bool, 2*n)
+	for row := 0; row < n; row++ { // The ith queen
+		for col := 0; col < n; col++ {
+			idx := row - col + n
+			if colLaid[col] || mainLaid[idx] || viceLaid[idx] {
+				continue
+			}
+			colNum[row] = col
+			colLaid[col] = true
+			mainLaid[idx] = true
+			viceLaid[idx] = true
+			break
+		}
+	}
+	fmt.Println(colNum)
+	return solutions
+}
+
+// func main() {
+// 	fmt.Println(solveNQueens(4))
+// }

+ 9 - 0
hard/helper.go

@@ -89,3 +89,12 @@ func printTree(root *TreeNode) { // Level order traversal
 	}
 	println()
 }
+
+func printBoard(board [][]byte) {
+	for _, row := range board {
+		for _, grid := range row {
+			print(string(grid), " ")
+		}
+		println()
+	}
+}