该问题是十九世纪著名的数学家高斯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;
}