N 皇后问题C语言实现

/***********************************************************

N个皇后放置到N*N的棋盘上,要求每两个皇后都不在一条直线上

**********************************************************/

#include <stdio.h>

#define QUEEN_NUM 4
int position[QUEEN_NUM] = {0};

/* x表示第几列,y表示第几行 */
int valid_place(int a[][QUEEN_NUM], int x, int y)
{
    int i;


    /* 横着一条无多余1个皇后 */
    for(i = 0; i < QUEEN_NUM; i++)
    {
        if(1 == a[y][i])
        {
            printf("tong yi hang \n");
            return -1;
        }
    }


    /* 竖着一列无多余1个皇后 */
    for(i = 0; i < QUEEN_NUM; i++)
    {
        if(1 == a[i][x])
        {
            return -1;
        }
    }


    /* 正对角线无多余一个皇后 */
    for(i = 0; (y-i)>=0 && (x-i) >= 0; i++ )
    {
        if( 1 == a[y-i][x-i] )
        {
            return -1;
        }
    }


    /* 反对角线无多余一个皇后 */
    for(i = 0; (x+i) < QUEEN_NUM && (y-i) >= 0; i++)
        if(1 ==  a[y-1][x+1])
        {
            return -1;
        }
        
    return 0;


}


void display_queen(int a[][QUEEN_NUM])
{
    int i,j;
    
    for(i = 0; i < QUEEN_NUM ; i++)
        for(j = 0; j < QUEEN_NUM ; j++)
        {
            if (0 == a[i][j])
            {
                printf("0");      
            }
            else 
            {
                printf("X");     
            }
            
            if( QUEEN_NUM-1 == j)
            {
                printf("\n");    
            }
        }
     printf("Display DONE ! \n");      
     
}


int place_queens(int a[][QUEEN_NUM])
{
    int i;            /* i表示横排 */
    int j = 0;        /* j表示纵列 */
    int k = 0;           
    
    while(j >= 0)
    {
        if(QUEEN_NUM == j)
        {
            /* 所有皇后都放置完成 */
            display_queen(a);
            a[j-1][position[j-1]] = 0;
            k = position[j-1]+1;   /* 从前面一个皇后位置的下个位置开始 */
            j--;                           
        }
        
        for(i = k ; i < QUEEN_NUM ; i++)
        {
            if(0 == valid_place(a,i,j))
            {
                 a[j][i] = 1;
                 position[j] = i;
                 j++;
                 k = 0;   /* 放置下一个皇后,则从第一个位置开始 */
                 break;
            }  
        }    
        
        /* 所有位置都非法,则回溯 */
        if(QUEEN_NUM == i)
        {
            if(0 == j)
            {
                return -1;     
            }
            a[j-1][position[j-1]] = 0;
            k = position[j-1]+1;   /* 从前面一个皇后位置的下个位置开始 */
            j--;
        }
    }  
    return -1;                  
}


int main(int argc, char **argv)
{
    int i;
    int j;
    int a[QUEEN_NUM][QUEEN_NUM];
    
    for(i = 0; i < QUEEN_NUM ; i++)
        for(j = 0; j < QUEEN_NUM ; j++)
            a[i][j] = 0;
            
    if (-1 == place_queens(a) )
    {
        printf("Over\n");
        return -1;       
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值