八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路分析:
1.先把第一个皇后放在第一行第一列;
2.将第二个皇后放在第二行第一列,判断是否可行,若不可行, 跳过本次循环,放到第二列判断,依次类推,找到合适位置;
3.继续放三皇后,还是从第一列、第二列......直到第八个皇后也能放在一个不冲突的位置,这样就找到了一个正确的解;
4.依次循环
该方法为循环嵌套方法,思路简单容易实现,但程序效率太低有待改进。
int main()
{
int count = 0;
for (int q1 = 0; q1 < 8; q1++) {
{
for (int q2 = 0; q2 < 8; q2++) {
if (q1 == q2 || q2 + 1 == q1 || q2 - 1 == q1)
continue;
for (int q3 = 0; q3 < 8; q3++) {
if (q3 == q1 || q3 + 2 == q1 || q3 - 2 == q1 ||
q3 == q2 || q3 + 1 == q2 || q3 - 1 == q2)
continue;
for (int q4 = 0; q4 < 8; q4++) {
if (q4 == q1 || q4 + 3 == q1 || q4 - 3 == q1 ||
q4 == q2 || q4 + 2 == q2 || q4 - 2 == q2 ||
q4 == q3 || q4 + 1 == q3 || q4 - 1 == q3)
continue;
for (int q5 = 0; q5 < 8; q5++) {
if (q5 == q1 || q5 + 4 == q1 || q5 - 4 == q1 ||
q5 == q2 || q5 + 3 == q2 || q5 - 3 == q2 ||
q5 == q3 || q5 + 2 == q3 || q5 - 2 == q3 ||
q5 == q4 || q5 + 1 == q4 || q5 - 1 == q4)
continue;
for (int q6 = 0; q6 < 8; q6++) {
if (q6 == q1 || q6 + 5 == q1 || q6 - 5 == q1 ||
q6 == q2 || q6 + 4 == q2 || q6 - 4 == q2 ||
q6 == q3 || q6 + 3 == q3 || q6 - 3 == q3 ||
q6 == q4 || q6 + 2 == q4 || q6 - 2 == q4 ||
q6 == q5 || q6 + 1 == q5 || q6 - 1 == q5)
continue;
for (int q7 = 0; q7 < 8; q7++) {
if (q7 == q1 || q7 + 6 == q1 || q7 - 6 == q1 ||
q7 == q2 || q7 + 5 == q2 || q7 - 5 == q2 ||
q7 == q3 || q7 + 4 == q3 || q7 - 4 == q3 ||
q7 == q4 || q7 + 3 == q4 || q7 - 3 == q4 ||
q7 == q5 || q7 + 2 == q5 || q7 - 2 == q5 ||
q7 == q6 || q7 + 1 == q6 || q7 - 1 == q6)
continue;
for (int q8 = 0; q8 < 8; q8++) {
if (q8 == q1 || q8 + 7 == q1 || q8 - 7 == q1 ||
q8 == q2 || q8 + 6 == q2 || q8 - 6 == q2 ||
q8 == q3 || q8 + 5 == q3 || q8 - 5 == q3 ||
q8 == q4 || q8 + 4 == q4 || q8 - 4 == q4 ||
q8 == q5 || q8 + 3 == q5 || q8 - 3 == q5 ||
q8 == q6 || q8 + 2 == q6 || q8 - 2 == q6 ||
q8 == q7 || q8 + 1 == q7 || q8 - 1 == q7)
continue;
count++;
printf("%d,%d,%d,%d,%d,%d,%d,%d\n", q1, q2, q3,q4,q5,q6,q7,q8);
}
}
}
}
}
}
}
}
}
printf("%d\n", count);
return 0;
}