Contents

八皇问题

Contents

八皇问题(Eight queens),问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题(摘自百度)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
func TestEightQueen(t *testing.T) {
	queen := []int{-1, -1, -1, -1, -1, -1, -1, -1}
	row := 0
	size := len(queen)
	for row >= 0 && row < size {
		pos := search(row, queen, size)
		if pos < 0 {
			queen[row] = -1
			row--
		} else {
			queen[row] = pos
			row++
		}
	}
  if row == -1 {
		fmt.Println("未找到方案")
		return
	}
	draw(queen)
}
func draw(queen []int) {
	for i := 0; i < len(queen); i++ {
		for j := 0; j < len(queen); j++ {
			if j == queen[i] {
				fmt.Printf("* ")
			} else {
				fmt.Printf("- ")
			}
		}
		fmt.Println()
	}
}
func search(row int, queen []int, size int) int {
	start := queen[row] + 1
	for column := start; column < size; column++ {
		if getTarget(column, queen, row) {
			return column
		}
	}
	return -1
}
func getTarget(column int, queen []int, row int) bool {
	for i := 1; i <= row; i++ {
		if queen[row-i] == column || queen[row-i] == column-i || queen[row-i] == column+i {

			return false
		}
	}
	return true
}

=== RUN   TestEightQueen
* - - - - - - - 
- - - - * - - - 
- - - - - - - * 
- - - - - * - - 
- - * - - - - - 
- - - - - - * - 
- * - - - - - - 
- - - * - - - - 
--- PASS: TestEightQueen (0.00s)
PASS