/**
八皇后问题
分析:
数组a, b, c 分别表示冲突
a数组代笔列冲突 从a[0] -a[7] 如果有皇后则为1 否则为0
b数组代表对角线冲突 为b[i-j+7] b[0 - 14] 如果有皇后则为1 否则为0
c数组代表对角线冲突 为c[i + j]
*/
#include <stdio.h>
static char queen[8][8];
static int a[8];
static int b[15];
static int c[15];
static int iQueenNum = 0; //记录总的棋盘状态
void qu(int i); //参数i代表行
int main(void)
{
int iLine, iColumn;
//棋盘初始化
for(iLine = 0; iLine < 8; iLine++)
{
a[iLine] = 0;
for(iColumn = 0; iColumn < 8; iColumn++)
{
queen[iLine][iColumn] = '*';
}
}
//对角线初始化
for(iLine = 0; iLine < 15; iLine++)
{
b[iLine]=c[iLine] = 0;
}
qu(0);
return 0;
}
void qu(int i)
{
int iColumn;
for(iColumn = 0; iColumn < 8; iColumn++)
{
if(a[iColumn] == 0 && b[i - iColumn + 7]==0 && c[iColumn + i] == 0) //无冲突
{
queen[i][iColumn] = '@'; //放皇后
a[iColumn] = 1; //标记, 下次不可以放
b[i - iColumn + 7] = 1;
c[iColumn + i] = 1;
if(i < 7) qu(i+1); //还没输出完 ,继续遍历
else
{
//输出棋盘状态
int iLine, iColumn;
printf("第%d种状态:\n", ++iQueenNum);
for(iLine = 0; iLine <8; iLine++)
{
for(iColumn = 0; iColumn <8; iColumn++)
printf("%c ",queen[iLine][iColumn]);
printf("\n");
}
printf("\n\n");
}
queen[i][iColumn] = '*';
a[iColumn] = 0;
b[i - iColumn + 7] = 0;
c[iColumn + i] = 0;
}
}
}
八皇后问题
最新推荐文章于 2023-07-07 14:04:01 发布