鱼C论坛

 找回密码
 立即注册

八皇后问题 递归算法 分享

已有 368 次阅读2019-8-30 18:48

#include <stdio.h>
int method = 0 ;

int danger (int row , int j , int (*table)[8]) // 判定
{
    int i , k , a=0 , b=0 , c=0 , d=0 , e=0 ;
    // 列方向是否有危险(竖直方向)
    for ( i = 0 ; i < 8 ; i++ )
    {
        if ( *(*(table+i)+j) != 0 )
        {
            a = 1 ;
            break ;
        }
    }
    // 判断左上方
    for ( i = row , k = j ; i >= 0 && k >= 0 ; i-- , k-- ) // k作为j的临时变量
    {
        if ( *(*(table+i)+k) != 0 )
        {
            b = 1 ;
            break ;
        }
    }
    // 判断右上方
    for ( i = row , k = j ; i >= 0 && k < 8 ; i-- , k++ )
    {
        if ( *(*(table+i)+k) != 0 )
        {
            c = 1 ;
            break ;
        }
    }
    // 判断右下方
    for ( i = row , k = j ; i < 8 && k < 8 ; i++ , k++ )
    {
        if ( *(*(table+i)+k) != 0 )
        {
            d = 1 ;
            break ;
        }
    }
    // 判断左下方
    for ( i = row , k = j ; i < 8 && k >= 0 ; i++ , k-- )
    {
        if ( *(*(table+i)+k) != 0 )
        {
            e = 1 ;
            break ;
        }
    }
    return (a+b+c+d+e) ;
}

void Eightqueen (int row , int n , int (*table)[8])
// 参数row表示起始行
// 参数n表示列数
// 参数(*table)[8]表示指向棋盘每一行的指针
{
    int table2[8][8] , i , j ;
    for ( i = 0 ; i < 8 ; i++ )
    {
        for ( j = 0 ; j < 8 ; j++ )
        {
            table2[i][j] = table[i][j] ; // 初始化临时棋盘
        }
    }
    if (8 == row) // 棋盘放置完毕
    {
        printf("method %d\n",method+1);
        for ( i = 0 ; i < 8 ; i++ )
        {
            for ( j = 0 ; j < 8 ; j++ )
            {
                printf("%d ",*(*(table2+i)+j)); // 打印临时棋盘
            }
            printf("\n");
        }
        printf("\n");
        method ++ ;
    }
    else // 没放置完毕
    {
        for ( j = 0 ; j < n ; j++ ) // 一行上的每一格格子,通过列变化而游览
        {
            if ( !danger(row,j,table2) ) // 针对第row行第j列的位置进行判定
            {
                // 安全的情况
                for( i = 0 ; i < 8 ; i++ ) // 这里i做列
                {
                    *(*(table2+row)+i) = 0 ; // 初始化为0
                }
                *(*(table2+row)+j) = 1 ; // 放置皇后
                Eightqueen(row+1,n,table2); // 递归
            }
        }
    }
}

int main ()
{
    int table[8][8] , i , j ;
    for ( i = 0 ; i < 8 ; i++ )
    {
        for ( j = 0 ; j < 8 ; j++ )
        {
            table[i][j] = 0 ; // 初始化棋盘
        }
    }
    Eightqueen(0,8,table); // 放置八皇后
    printf("total method: %d\n\n",method); // 方法总数
    return 0 ;
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 03:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部