HUC等风 发表于 2018-10-1 17:34:52

关于八皇后的问题

#include"stdio.h"
int sum=0;
int notDanger(int row,int j,int (*chess))
{   int i,k=0,m;
   //判断列方向
        for(i=0;i<8;i++)
        {if(*(*(chess+i)+j)!=0)
             {k=1;break;}
        }
        //判断左上方
        for(i=row,m=j;i>=0&&m>=0;i--,m--)
        {
      if(*(*(chess+i)+m)!=0)       
                       {k=1;break;}
        }
        //判断右下方
        for(i=row,m=j;i<8&&m<8;i++,m++)
        {
      if(*(*(chess+i)+m)!=0)       
                       {k=1;break;}
        }
    //判断右上方
   for(i=row,m=j;i>=0&&m<8;i--,m++)
        {
      if(*(*(chess+i)+m)!=0)       
                       {k=1;break;}
        }
   //判断左下方
for(i=row,m=j;i<8&&m>=0;i++,m--)
        {
      if(*(*(chess+i)+m)!=0)       
                       {k=1;break;}
        }
return k;

}

//参数 row表示起始行
//参数 n 表示列数
//参数 (*chess) 表示指向棋盘每一行的指针
void EightQueen(int row,int n,int (*chess))
{ int chess2;
int i,j;
            for(i=0;i<8;i++)
                for(j=0;j<8;j++)
                  chess2=chess;
if(8==row)
{/*for(i=0;i<8;i++){
      for(j=0;j<8;j++)
                        printf("%d",*(*(chess2+i)+j));
                  printf("\n");
                     }*/
sum=sum+1;;
    printf("\n");
}
else
{   
          //如果没有危险就继续往下
          for(j=0;j<n;j++)
          { if(notDanger(row,j,chess2))//判断这个位置是否有危险
          { for(i=0;i<8;i++)
                {
                      *(*(chess2+i)+j)=0;
                }
              *(*(chess2+row)+j)=1;
                  EightQueen(row+1,n,chess2);
          }
          }
}
}
void main()
{intchess,i,j;
    for(i=0;i<8;i++)
       for(j=0;j<8;j++)
          chess=0;
    EightQueen(0,8,chess);
printf("%d\n",sum);

}

HUC等风 发表于 2018-10-1 17:35:23

编译没问题,但执行有问题

claws0n 发表于 2018-10-1 19:14:47

#include <stdio.h>


int count = 0;

int notDanger(int row, int j, int (*chess))
{
        int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
        // check column
        for(i = 0; i < 8; i++)
        {
                if( *(*(chess+i)+j) != 0)
                {
                        flag1 = 1;
                        break;
                }
        }
       
        // check diagonal left-up
        for(i = row, k = j; i >= 0 && k >= 0; i--, k--)
        {
                if( *(*(chess+i)+k) != 0 )
                {
                        flag2 = 1;
                        break;
                }
        }
       
        // check diagonal right-down
        for(i = row, k = j; i < 8 && k < 8; i++, k++)
        {
                if( *(*(chess+i)+k) != 0 )
                {
                        flag3 = 1;
                        break;
                }
        }
       
        // check diagonal right-up
        for(i = row, k = j; i >= 0 && k < 8; i--, k++)
        {
                if( *(*(chess+i)+k) != 0 )
                {
                        flag4 = 1;
                        break;
                }
        }
       
        // check diagonal left-down
        for(i = row, k = j; i < 8 && k >= 0; i++, k--)
        {
                if( *(*(chess+i)+k) != 0 )
                {
                        flag5 = 1;
                        break;
                }
        }
       
        if( flag1 || flag2 || flag3 || flag4 || flag5 )
        {
                return 0;
        }
        else
        {
                return 1;
        }
}
       

// n is col
// row pointer
void EightQueen(int row, int n, int (*chess))
{
        int chess2, i, j;// temp chessboard
       
        for(i = 0; i < 8; i++)
        {
                for(j = 0; j < 8; j++)
                {
                        chess2 = chess;
                }
        }
       
        // Core recursion
        if(row == 8)
        {
                printf("%d-th solution\n", count+1);
                for(i = 0; i < 8; i++)
                {
                        for(j = 0; j < 8; j++)
                        {
                                printf("%d ", *(*(chess2+i)+j));
                        }
                        printf("\n");
                }
                printf("\n");
                count++;
        }
        else
        {
                // Is this a valid position?
                // If yes, continue...
                for(j = 0; j < n; j++)
                {
                        if( notDanger(row, j, chess) ) // valid position?
                        {
                                for(i = 0; i < 8; i++)
                                {
                                        *(*(chess2+row)+i) = 0;
                                }
                                *(*(chess2+row)+j) = 1;
                               
                                EightQueen(row+1, n, chess2);
                        }
                }
        }
       
}


int main(void)
{
        int chess, i, j;
       
        for(i = 0; i < 8; i++)
        {
                for(j = 0; j < 8; j++)
                {
                        chess = 0;
                }
        }
       
        EightQueen(0, 8, chess);
       
        printf("There are %d number of solutions in total\n\n", count);
       
        return 0;
}注释自己换一下吧~

HUC等风 发表于 2018-10-1 20:37:48

感谢楼上
页: [1]
查看完整版本: 关于八皇后的问题