您的位置:首页 > 其它

八皇后问题(回溯)

2015-11-29 20:07 267 查看
[问题描述]

皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: