回溯之八皇后问题
非递归
#include <stdio.h>
int col[8] = {0};
int left[15] = {0};
int right[15] = {0};
int Q[8] = {0};
void Queen()
{
int i = 0,j = 0,top = -1;
while(top != 7)
{
for(;j < 8;j++)
{
if(col[j] == 0 && left[i+j] == 0 && right[7+i-j] == 0)
{
Q[++top] = j;
col[j] = left[i+j] = right[7+i-j] = 1;
i++;
j = 0;
break;
}
}
if(j == 8)
{
i--;
j = Q[top--];
col[j] = left[i+j] = right[7+i-j] = 0;
j++;
}
}
}
int main()
{
Queen();
for(int i = 0;i < 8;i++)
{
printf("%d ",Q[i]);
}
return 0;
}
递归法
#include <stdio.h>
int Q[8] = {0};
int col[8] = {0};
int left[15] = {0};
int right[15] = {0};
void Print()
{
int cnt = 0;
printf("\n");
printf("第%d组:",++cnt);
for(int i = 0;i < 8;i++)
{
for(int j = 0;j < 8;j++)
{
if(Q[i] == j)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
}
}
void Queen(int i)
{
for(int j = 0;j < 8;j++)
{
if(col[j] == 0 && left[i+j] == 0 && right[7+i-j] == 0)
{
Q[i] = j;
col[j] = left[i+j] = right[7+i-j] = 1;
if(i < 7)
{
Queen(i+1);
}
else
{
Print();
col[j] = left[i+j] = right[7+i-j] = 0;
}
}
}
}
int main()
{
Queen(0);
return 0;
}
本文详细介绍了使用非递归和递归方法解决经典的八皇后问题。通过两种不同的算法实现,展示了如何在棋盘上放置八个皇后,使得任意两个皇后都不在同一行、列或对角线上。代码示例清晰地解释了每一步的逻辑,为理解回溯算法提供了一个直观的视角。

2万+

被折叠的 条评论
为什么被折叠?



