비 귀속 구 해 N 황후 문제 (역 추적 법)

2170 단어
일반적으로 역 추적 법 은 일종 의 궁 거 법 으로 각종 심도 있 는 검색 문 제 를 해결 하 는 데 적합 하 다 고 할 수 있다.
역 추적 법 은 광범 위 하 게 응용 되 는 알고리즘 이다.그 관건 은 공간 트 리 와 n 원조 의 실행 가능 한 정 의 를 푸 는 것 이다.
비 재 귀 소 거 법 프로그램의 구 조 는 대체적으로 같다. 이 프로그램의 구 조 는 여러 가지 유사 한 문 제 를 해결 할 수 있다. 예 를 들 어 그림 의 착색 문제 등 이다.
/*
 * 【    】   8×8          8   ,
 *            “  ”,        “ 
 *  ”        ,              
 *                    ,     
 *  、  、         。
 *
 *     (   )  8       
 *
 *           MAXQUEEN  ,    N    。
 *
 */

#include <stdio.h>
#include <conio.h>

#define TRUE 1
#define FALSE 0
#define MAXQUEEN 4
#define ABS(x) ((x>0)?(x):-(x))  /* x    */

/*  8       ,           */
int queen[MAXQUEEN];
int total_solution = 0;  /*       */

/*      */
void backtrack();
int attack(int,int);
void output_solution();


int main(void)
{
    backtrack();

    return 0;
}

/*            */
void backtrack()
{
    int row = 0;
    queen[row] = -1;
    while(row >= 0)
    {
        queen[row]++;
        while(queen[row] < MAXQUEEN && attack(row, queen[row]))
            queen[row]++;
        if(queen[row] < MAXQUEEN)
            if(row == (MAXQUEEN-1))
                output_solution(); /*       */
            else
                queen[++row] = -1;
        else
            row--;
    }
}

/*    (row,col)                    1,    0 */
int attack(int row, int col)
{
    int i, atk=FALSE;
    int offset_row, offset_col;
    i=0;
    while(!atk && i<row)
    {
        offset_row=ABS(i-row);
        offset_col=ABS(queen[i]-col);
        /*            ,         */
        /*             ,     ,atk==TRUE */
        atk = (queen[i] == col) || (offset_row == offset_col);
        i++;
    }
    return atk;
}

/*   8      */
void output_solution()
{
    int x,y;
    total_solution += 1;
    printf("Solution#%3d
\t",total_solution); for(x=0;x<MAXQUEEN;x++) { for(y=0;y<MAXQUEEN;y++) if(y==queen[x]) printf("Q"); /* Q */ else printf("-"); /* - */ printf("
\t"); } printf("
"); getchar(); }

좋은 웹페이지 즐겨찾기