www.pudn.com > nq.rar > nq.c


/* 
* File: queen.c 
* Description: 求 N 皇后问题回溯算法 
* Created: 2001/11/12 
* Author: Justin Hou [mailto:justin_hou@hotmail.com] 
*/ 
#include  
 
#define  DelayTime  20000                /* 显示棋局时间      */ 
#define  TopX      10                    /* 棋盘左上角 x 坐标  */ 
#define  TopY      5                    /* 棋盘左上角 y 坐标  */ 
 
int N;                                    /* 皇后数量          */ 
 
int a[8], b[15], c[15]; 
/* 
* a[col-1] 记录第 col 列有无皇后, 1 表示有。 
* b[row+col-2] 记录从左上数第 row+col-1 条斜率为 1 的线上有无皇后。 
* c[row-col+7] 记录从右上数第 row-col+8 条斜率为 -1 的线上有无皇后。 
*/ 
int Num = 0; 
int row;   
void BackTrack (int row) 
{ 
    int col;                                        /* 局部变量 */ 
    for (col=1; col<=N; col++) 
    { 
        if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0) 
        { 
            a[col-1] = 1;                          /* 更改数据 */ 
            b[row+col-2] = 1; 
            c[row-col+N-1] = 1; 
 
            gotoxy(col*2 + TopX, row + TopY);      /* 画皇后  */ 
            putch('Q'); 
 
            if (row < N) 
            { 
                BackTrack (row + 1); 
            } 
            else 
            { 
                Num++;                              /* 递归终点 */ 
                gotoxy(40, 9); 
                printf("Num: %d ", Num); 
                delay(DelayTime); 
            } 
 
            a[col-1] = 0;                          /* 清空数据 */ 
            b[row+col-2] = 0; 
            c[row-col+N-1] = 0; 
 
            gotoxy(col*2 + TopX, row + TopY);      /* 清除图象 */ 
putch('.'); 
 
        }/* end if */ 
    }/* end for */ 
}/* end function BackTrack */ 
 
void main() 
{ 
    int i, j; 
    clrscr(); 
 
    gotoxy(1, 10);                            /* 要求用户输入皇后数量 */ 
    printf("Input the number of queen: "); 
    while(N <= 0 || N > 14) 
    { 
        scanf("%d", &N); 
        if(N > 14) printf("Two huge number, input again:"); 
        if(N <= 0) printf("Can's smaller than 1, again:"); 
} 
 
clrscr(); 
 
    for(i=1; i<=N; i++)                        /*  画棋盘(Chessboard) */ 
    { 
        for(j=1; j<=N; j++) 
        { 
            gotoxy(i*2 + TopX, j + TopY); 
            putch('.'); 
        } 
    } 
 
    BackTrack(1);                                    /* 开始回溯算法 */ 
 
    gotoxy(12, 17);                                  /* 显示最后结果 */ 
    printf ("There are %d kinds of solution.\n", Num); 
 
    getch(); 
}