作者在 2010-12-08 17:19:53 发布以下内容
#include <stdio.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define MAXQUEEN 8
#define ABS(x) ((x>0)?(x):-(x))
int queen[MAXQUEEN];
int total_solution;
void place(int);
int attack(int,int);
void output_solution();
void main(void)
{
place(0);
}
void place(int q)
{
int i;
i=0;
while (i<MAXQUEEN)
{
if (!attack(i,q))
{
queen[q]=i;
if (q==7)
{
output_solution();
}
else
place(q+1);
}
i++;
}
}
int attack(int row,int col)
{
int i,atk=FALSE;
int offset_row,offset_col;
i=0;
while (!atk && i<col)
{
offset_col=ABS(i-col);//i表示皇后所在的列位置,col表示第二个皇后所在的列位置
offset_row=ABS(queen[i]-row);//表示皇后所在的行位置 和第二个皇后所在的行位置,用来比较两个皇后是否在同一对角线;
atk=(queen[i]==row)||(offset_row==offset_col);//判断两个皇后是否在同一行,是否是在对角线;
i++;
}
return atk;
}
void output_solution()
{
int x,y;
total_solution+=1;
printf("solution #%3d\n",total_solution);
for (x=0;x<MAXQUEEN;x++)
{
for (y=0;y<MAXQUEEN;y++)
{
if (x==queen[y])
{
printf("Q");
}
else
{
printf("-");
}
}
printf("\n");
}
printf("\n");
}
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define MAXQUEEN 8
#define ABS(x) ((x>0)?(x):-(x))
int queen[MAXQUEEN];
int total_solution;
void place(int);
int attack(int,int);
void output_solution();
void main(void)
{
place(0);
}
void place(int q)
{
int i;
i=0;
while (i<MAXQUEEN)
{
if (!attack(i,q))
{
queen[q]=i;
if (q==7)
{
output_solution();
}
else
place(q+1);
}
i++;
}
}
int attack(int row,int col)
{
int i,atk=FALSE;
int offset_row,offset_col;
i=0;
while (!atk && i<col)
{
offset_col=ABS(i-col);//i表示皇后所在的列位置,col表示第二个皇后所在的列位置
offset_row=ABS(queen[i]-row);//表示皇后所在的行位置 和第二个皇后所在的行位置,用来比较两个皇后是否在同一对角线;
atk=(queen[i]==row)||(offset_row==offset_col);//判断两个皇后是否在同一行,是否是在对角线;
i++;
}
return atk;
}
void output_solution()
{
int x,y;
total_solution+=1;
printf("solution #%3d\n",total_solution);
for (x=0;x<MAXQUEEN;x++)
{
for (y=0;y<MAXQUEEN;y++)
{
if (x==queen[y])
{
printf("Q");
}
else
{
printf("-");
}
}
printf("\n");
}
printf("\n");
}