该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
正确的结果应该是92种,实现方法如下:
//八皇后问题 #include "stdafx.h" #include<iostream> #include<stdio.h> int count = 0; int notDanger(int row, int j, int(*chess)[8]) { int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0; //判断列方向 for (i = 0; i<8; i++) { if (*(*(chess + i) + j) != 0) { flag1 = 1; break; } } //判断左上方 for (i = row, k = j; i >= 0 && k >= 0; i--, k--) { if (*(*(chess + i) + k) != 0) { flag2 = 1; break; } } //判断右下方 for (i = row, k = j; i<8 && k<8; i++, k++) { if (*(*(chess + i) + k) != 0) { flag3 = 1; break; } } //判断右上方 for (i = row, k = j; i >= 0 && k<8; i--, k++) { if (*(*(chess + i) + k) != 0) { flag4 = 1; break; } } //判断左下方 for (i = row, k = j; i<8 && k >= 0; i++, k--) { if (*(*(chess + i) + k) != 0) { flag5 = 1; break; } } if (flag1 || flag2 || flag3 || flag4 || flag5) { return 0; } else { return 1; } } //参数row表示起始行 //参数n表示列数,始终等于8 //(*chess)[8]表示指向棋盘每一行的指针 void EightQueen(int row, int n, int(*chess)[8]) { int chess2[8][8], i, j; for (i = 0; i<8; i++) { for (j = 0; j<8; j++) { chess2[i][j] = chess[i][j]; } } //当达到第八行时,输出整个棋盘的元素 if (8 == row) { printf("第%d种\n", count + 1); for (i = 0; i<8; i++) { for (j = 0; j<8; j++) { printf("%d", *(*(chess2 + i) + j));//输出棋盘每个位置处的值 } printf("\n"); } printf("\n"); count++; } else//判断这个位置是否有危险,如果没有危险?继续往下 { for (j = 0; j<n; j++) { if (notDanger(row, j, chess))//判断是否有危险,1:没有危险 { for (i = 0; i<8; i++) { *(*(chess2 + row) + i) = 0; } *(*(chess2 + row) + j) = 1; EightQueen(row + 1, n, chess2); } } } } int main() { int chess[8][8], i, j; //将棋盘的每个位置赋初值0 for (i = 0; i<8; i++) { for (j = 0; j<8; j++) { chess[i][j] = 0; } } //从第0行开始对8行分别检测 EightQueen(0,8,chess); printf("总共有%d种解决方法!\n", count); return 0; }