八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
目录
- N皇后问题- 代码如下(C++):
 
- 以下为用程序求出的所有8皇后的解(92种):
N皇后问题
在这里我们解决的是N皇后问题,即在一个n*n的棋盘上,摆放n个皇后,使之不相互攻击。问有几种摆放方法(不考虑棋盘的对称性).
对于8皇后问题,我们可以通过8重循环的回溯算法解决,但是对于N皇后,我们无法预知N的值,所以不能使用这种方法。但是可以使用递归实现循环:每一次递归解决一行的皇后摆放位置,使之不与前几行冲突,之后再递归调用自身确定下一行的位置。
代码如下(C++):
| 12
 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
 
 | #include <iostream>using namespace std;
 
 int N;
 int queen_pos[100];
 int num = 0;
 void queen(int k);
 
 int main()
 {
 cin >> N;
 queen(0);
 cout << num << endl;
 system("pause");
 return 0;
 }
 
 
 
 
 
 void queen(int k)
 {
 if (k==N)
 {
 for (int i = 0; i < N; i++)
 {
 cout << queen_pos[i] + 1<<" ";
 }
 cout << endl;
 num++;
 }
 for (int i = 0; i < N; i++)
 {
 int j = 0;
 for (; j < k; j++ )
 {
 
 if (queen_pos[j] == i || (abs(queen_pos[j] - i) == k - j))
 break;
 }
 if (j==k)
 {
 queen_pos[k] = i;
 queen(k+1);
 }
 }
 }
 
 
 | 
以下为用程序求出的所有8皇后的解(92种):
| 12
 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
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 
 | 1 5 8 6 3 7 2 41 6 8 3 7 4 2 5
 1 7 4 6 8 2 5 3
 1 7 5 8 2 4 6 3
 2 4 6 8 3 1 7 5
 2 5 7 1 3 8 6 4
 2 5 7 4 1 8 6 3
 2 6 1 7 4 8 3 5
 2 6 8 3 1 4 7 5
 2 7 3 6 8 5 1 4
 2 7 5 8 1 4 6 3
 2 8 6 1 3 5 7 4
 3 1 7 5 8 2 4 6
 3 5 2 8 1 7 4 6
 3 5 2 8 6 4 7 1
 3 5 7 1 4 2 8 6
 3 5 8 4 1 7 2 6
 3 6 2 5 8 1 7 4
 3 6 2 7 1 4 8 5
 3 6 2 7 5 1 8 4
 3 6 4 1 8 5 7 2
 3 6 4 2 8 5 7 1
 3 6 8 1 4 7 5 2
 3 6 8 1 5 7 2 4
 3 6 8 2 4 1 7 5
 3 7 2 8 5 1 4 6
 3 7 2 8 6 4 1 5
 3 8 4 7 1 6 2 5
 4 1 5 8 2 7 3 6
 4 1 5 8 6 3 7 2
 4 2 5 8 6 1 3 7
 4 2 7 3 6 8 1 5
 4 2 7 3 6 8 5 1
 4 2 7 5 1 8 6 3
 4 2 8 5 7 1 3 6
 4 2 8 6 1 3 5 7
 4 6 1 5 2 8 3 7
 4 6 8 2 7 1 3 5
 4 6 8 3 1 7 5 2
 4 7 1 8 5 2 6 3
 4 7 3 8 2 5 1 6
 4 7 5 2 6 1 3 8
 4 7 5 3 1 6 8 2
 4 8 1 3 6 2 7 5
 4 8 1 5 7 2 6 3
 4 8 5 3 1 7 2 6
 5 1 4 6 8 2 7 3
 5 1 8 4 2 7 3 6
 5 1 8 6 3 7 2 4
 5 2 4 6 8 3 1 7
 5 2 4 7 3 8 6 1
 5 2 6 1 7 4 8 3
 5 2 8 1 4 7 3 6
 5 3 1 6 8 2 4 7
 5 3 1 7 2 8 6 4
 5 3 8 4 7 1 6 2
 5 7 1 3 8 6 4 2
 5 7 1 4 2 8 6 3
 5 7 2 4 8 1 3 6
 5 7 2 6 3 1 4 8
 5 7 2 6 3 1 8 4
 5 7 4 1 3 8 6 2
 5 8 4 1 3 6 2 7
 5 8 4 1 7 2 6 3
 6 1 5 2 8 3 7 4
 6 2 7 1 3 5 8 4
 6 2 7 1 4 8 5 3
 6 3 1 7 5 8 2 4
 6 3 1 8 4 2 7 5
 6 3 1 8 5 2 4 7
 6 3 5 7 1 4 2 8
 6 3 5 8 1 4 2 7
 6 3 7 2 4 8 1 5
 6 3 7 2 8 5 1 4
 6 3 7 4 1 8 2 5
 6 4 1 5 8 2 7 3
 6 4 2 8 5 7 1 3
 6 4 7 1 3 5 2 8
 6 4 7 1 8 2 5 3
 6 8 2 4 1 7 5 3
 7 1 3 8 6 4 2 5
 7 2 4 1 8 5 3 6
 7 2 6 3 1 4 8 5
 7 3 1 6 8 5 2 4
 7 3 8 2 5 1 6 4
 7 4 2 5 8 1 3 6
 7 4 2 8 6 1 3 5
 7 5 3 1 6 8 2 4
 8 2 4 1 7 5 3 6
 8 2 5 3 1 7 4 6
 8 3 1 6 2 5 7 4
 8 4 1 3 6 2 7 5
 
 |