八皇后问题

来源:互联网 发布:linux tail命令 编辑:程序博客网 时间:2024/05/18 00:22
         八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。(摘自百度百科)
#include <stdio.h>#include <stdbool.h>#define maxBoard 30    // 棋盘最大为30*30int boardSize;    // 棋盘边长 = 皇后最大数目int count;    // 皇后数目int queenSquare[maxBoard][maxBoard];    // 棋盘bool isSolved()    // 是否得到问题的一个解{    return (count == boardSize);    // 判断条件:皇后数目与边长相等}void print()    // 打印棋盘{    int i, j;    for (i = 0; i < boardSize; i++)    {        for (j = 0; j < boardSize; j++)        {            printf(" %d ", queenSquare[i][j]);        }        printf("\n");    }    printf("\n");}void _remove(int col)    // 移除一个棋子{    queenSquare[--count][col] = 0;}void insert(int col)    // 放置一个棋子{    queenSquare[count++][col] = 1;}void loadQueens()    // 加载游戏信息并置空棋盘{    int row, col;    count = 0;    for (row = 0; row < boardSize; row++)        for (col = 0; col < boardSize; col++)            queenSquare[row][col] = 0;}int unguarded(int col)    // 判断皇后是否会被前面的皇后攻击{    int i;    int ok = 1;    for (i = 0; ok && i < count; i++)    // 判断所在列有没有皇后        ok = !queenSquare[i][col];    for (i = 1; ok && (count - i) >= 0 && (col - i) >= 0; i++)    // 判断左斜对角有没有皇后        ok = !queenSquare[count - i][col - i];    for (i = 1; ok && (count - i) >= 0 && (col + i) < boardSize; i++)    // 判断右斜对角有没有皇后        ok = !queenSquare[count - i][col + i];    // 若有皇后,ok被置为false    return ok;}void printInformation(){    printf("This is the Queens game.\n");}void solveFrom()    // 求解函数{    int col;    if (isSolved())    // 如果找到一个解        print();    // 打印这个解    else        for (col = 0; col < boardSize; col++)            if (unguarded(col))    // 如果不会被前面的皇后攻击            {                insert(col);    // 在这个位置插入皇后                solveFrom();                _remove(col);    // 后面有皇后会被攻击,则移除这个皇后            }}int main(void){    printInformation();    printf("What is the size of the board? ");    scanf(" %d", &boardSize);    if (boardSize < 0 || boardSize > maxBoard)        printf("The number must between 0 and %d.\n", maxBoard);    else    {        loadQueens();        solveFrom();    }    return 0;}

0 0
原创粉丝点击