八皇后问题的一种解法

/*八皇后问题,在一个8*8的数组中,放置8个国际象棋中的皇后棋子,问有多少种摆法        */

/*可以让皇后不在其他七个棋子的攻击范围之内                                          */

/*皇后的攻击范围是,以其所在点为中心的一个米字型,也就是说该棋子的                  */

/*判断放在该位置的皇后是否在其他皇后的攻击范围中,                                  */

/*如果该行的所有列都无法放置皇后,向前回溯一步,将前一行皇后放置在下一个可能的位置  */

 

#include<stdio.h>

#define LINE 8

#define COL 8

#define QUEEN 8

#define TRUE 1

#define FALSE 0

void eight_queen(char (*)[],int,int);

void show_array(const char (*)[]);

int guess_queen(char (*)[],int,int);

int main(void)

{

    int count=0;

    static char array[LINE][COL]={0};    /*据说静态数组能够提高效率,在一瞬间就初始化完毕 */

   

    while(count<LINE)

    {

       eight_queen(array,QUEEN,count);

       show_array(array);

       count++;

       puts("Very good you win!(press any key to continue!)");

       getchar();

    }  

    printf("QUEEN is :%d/n",count);

    puts("Bye");

   

    return 0;

}

void eight_queen(char (*array)[QUEEN],int q,int n)

{

    int i,j,c=0;

    int num=0,t=0;

    static char count[LINE]={0};

 

    for(i=n;i<LINE;i+=1)

    {

       num=i;

       for(t=FALSE,c=count[i],j=0;j<COL;j+=1)

       {

           t=guess_queen(array,i,j);   /*不仅要判断该位置是否在其他皇后攻击范围内,还要注意只求,

                                          该位置的低行标位置皇后,而忽略高行标位置        */

           if(c!=0&&t==TRUE)    /*  如果经过上面的判断,该位置可以放置皇后的同时,

                                          代表该数组位置是否后续行放置皇后失败返回的判断量,

                                          0时可以放置皇后并计数*/

           {

              c--;

              t=FALSE;

              continue;            /*如果c不为0时,要跳到下一个可以放置皇后的位置         */

           }

          

           else if(t==TRUE)         /*经过判断后,该位置为真的同时,放置位置次数为0时,

                                       在该位置上放置皇后,并计数                         */

           {

              array[i][j]='Q';

              count[i]+=1;         /*记录跳过可放置皇后位置的次数,为后续返回时做准备     */

              num++;

              break;

           }

          

       }

       if(t==FALSE)                /*如果没有成功放置皇后,要返回前一行更换皇后放置的位置 */

       {

           int z=i;

           i-=2;

           while(z<LINE)

              count[z++]=0;

       }  

    }

   

}

int guess_queen(char (*array)[COL],int i,int j)/*判断该位置是否与其他皇后有冲突            */

{

    int k,g;

   

    if(j==0)

    for(g=0;g<COL;g++)                     /*清空该行在回溯时清空皇后                       */

       array[i][g]=0;

    g=i;

    while(--g>=0)                          /*元素正下方是否有皇后能够攻击该位置的皇后       */

    if(array[g][j]=='Q')

       return FALSE;

   

    g=i;

    k=j;

    while(--g>=0&&--k>=0)              /*王后左下对角线上是否有皇后能够攻击该位置       */

       if(array[g][k]=='Q')

           return FALSE;

    g=i;

    k=j;

    while(--g>=0&&++k<COL)             /*王后右下对角线上是否有皇后能够攻击该位置       */

       if(array[g][k]=='Q')

           return FALSE;

   

    return TRUE;

}

void show_array(const char (*array)[QUEEN])             /*输出数组中皇后的摆放情况      */

{  

    int i,j;

   

    for(i=0;i<LINE;i++)

    {

       for(j=0;j<COL;j++)

       {

           if(array[i][j]=='Q')

           {

              printf("%3c",array[i][j]);

              continue;

           }

           printf("%3d",array[i][j]);

       }

       putchar('/n');

    }

}/*终于弄出了一个雏形,现在能把 皇后在第一行八个位置上的 问题解决掉了,之后要解决的是,所有解法的问题*/

 

还没有学习算法,而且函数递归用的不好,所以使用的是循环控制;同时由于怕麻烦也没有使用指针法掉用数组,效率低,以后改进

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值