题目描述
经典的八皇后问题,在一个$8*8$的棋盘上放置8个皇后,使得不能互相攻击到,皇后的攻击范围的同一行,同一列以及同一个斜线。要求输出所有不会互相攻击到的摆放方式,所有通过旋转,对称都方式得到的摆放方式均认为是不同的摆放方式。棋盘被编号为$0-7$行,$0-7$列。
输入
无输入。
输出
每行一个数字代表摆放方式,如$01234567$代表从第$0$行放在$0$列,第$1$行放在$1$列,第$2$行放在$2$列,按照升序输出。
题解
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
| #include<bits/stdc++.h> using namespace std; #define max 8 int queen[max], sum=0; void show() { int i; for(i = 0; i < max; i++) { printf("%d", queen[i]); } printf("\n"); sum++; } int PLACE(int n) { int i; for(i = 0; i < n; i++) { if(queen[i] == queen[n] abs(queen[i] - queen[n]) == (n - i)) { return 1; } } return 0; } void NQUEENS(int n) { int i; for(i = 0; i < max; i++) { queen[n] = i; if(!PLACE(n)) { if(n == max - 1) { show(); } else { NQUEENS(n + 1); } } } } int main() { NQUEENS(0); return 0; }
|