/* */
//回溯法实现8皇后问题。共有92种解法,其中包含对称解法。
// GPH 2012-11-04 16:10
// 修改时间: 2014/05/05
/* */
#include<stdio.h>
#include<stdlib.h>
static int Queen[9][8];//皇后标记
static int a[8]; //记录皇后列的信息
static int b[15];//记录主对角线的皇后
static int c[15];//记录次对角线的皇后
static int Sum;
void backtrace(int i)
{
for(int iC = 0;iC < 8;iC++)
{ //用a[iC]来表示列,i记录行
//列ic,行i。主对角线b,次对角线c
// 如(2,2),(3,3)都是b[0],(1,3)(3,1)都是c[4]
if(a[iC] == 0 && b[i-iC+8] == 0 && c[i+iC] == 0)
{ //不冲突
Queen[i][iC] = 'o'; //放置
a[iC] = 1;
b[i-iC+8] = 1;
c[i+iC] = 1;
if(i < 7)
backtrace(i+1);
else
{
printf("第%d种情况:\n",++Sum);
for(int j = 0;j < 8;j++)
{
for(int l = 0;l < 8;l++)
printf("%c ",Queen[j][l]);
printf("\n");
}
printf("\n");
//getchar();
}
Queen[i][iC] = '*'; //重置
a[iC] = 0;
b[i-iC+8] = 0;
c[i+iC] = 0;
}//if
}//for
}//backtrace
int main()
{
for(int i = 0;i < 8;i++)
{
a[i] = 0;
for(int j = 0;j < 8;j++)
Queen[i][j]='*';
}
for(int i = 0;i < 15;i++)
b[i] = c[i] = 0;
backtrace(0);
printf("共%d种排法\n",Sum);
//system("pause");
}
C语言用回溯解决八皇后问题
最新推荐文章于 2023-12-29 12:49:32 发布