八皇后问题的一解

作者在 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");
}

程序 | 阅读 703 次
文章评论,共0条
游客请输入验证码
浏览31544次