[问题描述]
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
[解题思路]
从第1行第1个开始,遍历8*8格,当发现当前点在同一行、同一列或同一斜线上有相同的点就不取该点,遍历到第八行,摆法就加1,然后就回溯。
[代码实现]
#include<stdio.h>
int ans[8] = {0}; /*存放棋子在每行的位置*/
int Count = 0;
void Print()
{
for(int i = 0; i <8; i ++)
{
for(int j = 0; j < 8; j ++)
{
if(j==ans[i])
{
printf("# ");
continue;
}
printf("* ");
}
printf("\n");
}
printf("_____________________________________\n");
}
int IsRepeat(int new_i, int new_j)
{
int j;
for(int i= 0; i < new_i; i++)
{
j = ans[i];
if(new_j == j) /*竖*/
return 0;
if((i + j) == (new_i + new_j)) /*右斜线*/
return 0;
if((i - j) == (new_i - new_j)) /*左斜线*/
return 0;
}
return 1;
}
void dfs(int i) //i行
{
if(i==8)
{
Count ++;
Print();
return ;
}
for(int j = 0; j < 8; j++) /*第i行的第几j个*/
{
if(IsRepeat(i, j))
{
ans[i] = j;
dfs(i + 1);
ans[i] = 0;
}
}
}
int main()
{
dfs(0);
printf("total = %d\n", Count);
return 0;
}