幽梦三影 发表于 2018-5-2 16:43:20

八皇后问题怎么执行的92次,一次if语句执行完不就结束了吗

//八皇后问题
#include<stdio.h>
int count=1;
int notdanger(int row,int j,int (*chess))
{
        int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
        for (i=0;i<8;i++) //判断棋子所在的列是否危险
        {
                if(chess!=0)
                {
      flag1=1;   //1表示有危险
      break;
      }
        }
        for (i=row,k=j;i>=0&&k>=0;i--,k--)//判断左上方是否危险
    {
      if(chess!=0)
      {
      flag2=1;
      break;
      }
    }
    for(i=row,k=j;i>=0&&k<8;i--,k++)//判断右上方是否危险,这里不能是小于等于
    {
      if(chess!=0)
      {
      flag3=1;
      break;
      }
    }
    for(i=row,k=j;i<8&&k>=0;i++,k--)//判断左下方是否危险
    {
      if(chess!=0)
      {
      flag4=1;
      break;
      }
    }
    for(i=row,k=j;i<8&&k<8;i++,k++)//判断右下方是否危险
    {
      if(chess!=0)
      {
      flag5=1;
      break;
      }
    }
    if(flag1||flag2||flag3||flag4||flag5)
    {
      return 0;
    }
    else
    {
    return 1;
    }
}
void eightgueen(int row,int col,int (*chess))
{
        int chess2,i,j;
        for (i=0;i<8;i++)   //用chess2保存之前赋过1的棋子
        {
                                 //不然递归调用时chess2又被全部置0
                for (j=0;j<8;j++)
                chess2=chess;
        }
        if(row==8) //到第八行就输出
        {
                printf("第%d种\n",count);
                for (i=0;i<8;i++)
                {
                        for (j=0;j<8;j++)
                  printf("%d ",chess2);
                        printf("\n");
                }
                printf("\n");
                count++;
        } else
        {
          for (j=0;j<col;j++)//先判断每一列上的数是否危险
                {
                        if(notdanger(row,j,chess2))
            {
            for(i=0;i<8;i++)
            chess2=0;//将不危险的那一整列(除了那row行)先赋值为0
            chess2=1;
                            eightgueen(row+1,col,chess2);//如果不危险,继续往下一行
            }
                }
        }
}
int main()
{
        int i,j,chess;
        for (i=0;i<8;i++)
        {
                for (j=0;j<8;j++)//先全部赋值为0
                chess=0;
        }
        eightgueen(0,8,chess);
    return 0;
}

BngThea 发表于 2018-5-2 17:04:09

递归调用,第85行

幽梦三影 发表于 2018-5-2 17:07:59

BngThea 发表于 2018-5-2 17:04
递归调用,第85行

if执行了else不就不被执行了么

BngThea 发表于 2018-5-2 17:12:29

幽梦三影 发表于 2018-5-2 17:07
if执行了else不就不被执行了么

是啊,但是这个函数被递归调用了,所以执行了很多次if-else判断

幽梦三影 发表于 2018-5-2 20:41:54

BngThea 发表于 2018-5-2 17:12
是啊,但是这个函数被递归调用了,所以执行了很多次if-else判断

我还是不明白,难不成83行意思标错了,之前已经赋值0了,这里又赋值0

BngThea 发表于 2018-5-2 21:31:23

幽梦三影 发表于 2018-5-2 20:41
我还是不明白,难不成83行意思标错了,之前已经赋值0了,这里又赋值0

不同的路径当然分别标注

幽梦三影 发表于 2018-5-3 10:08:07

BngThea 发表于 2018-5-2 21:31
不同的路径当然分别标注

我终于懂了
页: [1]
查看完整版本: 八皇后问题怎么执行的92次,一次if语句执行完不就结束了吗