鱼C论坛

 找回密码
 立即注册
查看: 1918|回复: 4

[已解决]关于八皇后问题

[复制链接]
发表于 2018-8-20 22:51:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
感觉照着视屏跟着打了,调试的时候根本就没有进入程序,萌新不知道咋回事,求大佬帮忙;

#include<stdio.h>


int count = 0;

void eight(int row, int line, int(*chess)[8]);
int ok(int row, int line, int(*chess)[8]);
int main()
{
        int chess[8][8] = { 0 }, i, j;

        eight(0, 8, chess);
        printf("总共有%d解决方法\n", count);
        return 0;
}
int ok(int row, int line, int(*chess)[8])
{
        int i, j, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
        for (i = 0; i < 8; i++)//判断列方向
        {
                if (*(*(chess + i) + line) != 0)
                {
                        flag1 = 1;
                        break;
                }
        }
        for (i = row, j = line; i >= 0 && j >= 0; i--, j--)
        {
                if (*(*(chess + i) + j) != 0)
                {
                        flag2 = 1;
                        break;
                }
        }
        for (i = row, j = line; i<8 && j <8; i++, j++)
        {
                if (*(*(chess + i) + j) != 0)
                {
                        flag3 = 1;
                        break;
                }
        }

        for (i = row, j = line; i >= 0 && j <8; i--, j++)
        {
                if (*(*(chess + i) + j) != 0)
                {
                        flag4 = 1;
                        break;
                }
        }

        for (i = row, j = line; i >= 0 && j <8; i--, j++)
        {
                if (*(*(chess + i) + j) != 0)
                {
                        flag4 = 1;
                        break;
                }
        }


        for (i = row, j = line; i <8 && j >= 0; i++, j--)
        {
                if (*(*(chess + i) + j) != 0)
                {
                        flag5 = 1;
                        break;
                }
        }
        if (flag1 || flag2 || flag3 || flag4 || flag5)
        {
                return 0;
        }
        else
        {
                return 1;
        }
}

void eight(int row, int line, int(*chess)[8])//row表示起始行,line表示列数;(*chess)[8]表示指向棋盘每一行指针
{
        int chess2[8][8], i, j;
        for (i = 0; i < 8; i++)
                for (j = 0; j < 8; j++)
                {
                        chess2[i][j] = chess[i][j];
                }

        if (8 == row)
        {
                printf("第 %d 种", 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
        {

                for (j = 0; j < line; j++)
                {
                        if (ok(row, line, chess))//判断是否危险
                        {
                                for (i = 0; i < 8; i++)
                                {
                                        *(*(chess2 + row) + i) = 0;
                                }
                                *(*(chess2 + row) + j) = 1;

                                eight(row + 1, line, chess2);

                        }
                }
        }






最佳答案
2018-8-20 23:03:42
  1. #include <stdio.h>


  2. int count = 0;

  3. int notDanger(int row, int j, int (*chess)[8])
  4. {
  5.         int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
  6.         // check column
  7.         for(i = 0; i < 8; i++)
  8.         {
  9.                 if( *(*(chess+i)+j) != 0)
  10.                 {
  11.                         flag1 = 1;
  12.                         break;
  13.                 }
  14.         }
  15.        
  16.         // check diagonal left-up
  17.         for(i = row, k = j; i >= 0 && k >= 0; i--, k--)
  18.         {
  19.                 if( *(*(chess+i)+k) != 0 )
  20.                 {
  21.                         flag2 = 1;
  22.                         break;
  23.                 }
  24.         }
  25.        
  26.         // check diagonal right-down
  27.         for(i = row, k = j; i < 8 && k < 8; i++, k++)
  28.         {
  29.                 if( *(*(chess+i)+k) != 0 )
  30.                 {
  31.                         flag3 = 1;
  32.                         break;
  33.                 }
  34.         }
  35.        
  36.         // check diagonal right-up
  37.         for(i = row, k = j; i >= 0 && k < 8; i--, k++)
  38.         {
  39.                 if( *(*(chess+i)+k) != 0 )
  40.                 {
  41.                         flag4 = 1;
  42.                         break;
  43.                 }
  44.         }
  45.        
  46.         // check diagonal left-down
  47.         for(i = row, k = j; i < 8 && k >= 0; i++, k--)
  48.         {
  49.                 if( *(*(chess+i)+k) != 0 )
  50.                 {
  51.                         flag5 = 1;
  52.                         break;
  53.                 }
  54.         }
  55.        
  56.         if( flag1 || flag2 || flag3 || flag4 || flag5 )
  57.         {
  58.                 return 0;
  59.         }
  60.         else
  61.         {
  62.                 return 1;
  63.         }
  64. }
  65.        

  66. // n is col
  67. // row pointer
  68. void EightQueen(int row, int n, int (*chess)[8])
  69. {
  70.         int chess2[8][8], i, j;  // temp chessboard
  71.        
  72.         for(i = 0; i < 8; i++)
  73.         {
  74.                 for(j = 0; j < 8; j++)
  75.                 {
  76.                         chess2[i][j] = chess[i][j];
  77.                 }
  78.         }
  79.        
  80.         // Core recursion
  81.         if(row == 8)
  82.         {
  83.                 printf("%d-th solution\n", count+1);
  84.                 for(i = 0; i < 8; i++)
  85.                 {
  86.                         for(j = 0; j < 8; j++)
  87.                         {
  88.                                 printf("%d ", *(*(chess2+i)+j));
  89.                         }
  90.                         printf("\n");
  91.                 }
  92.                 printf("\n");
  93.                 count++;
  94.         }
  95.         else
  96.         {
  97.                 // Is this a valid position?
  98.                 // If yes, continue...
  99.                 for(j = 0; j < n; j++)
  100.                 {
  101.                         if( notDanger(row, j, chess) ) // valid position?
  102.                         {
  103.                                 for(i = 0; i < 8; i++)
  104.                                 {
  105.                                         *(*(chess2+row)+i) = 0;
  106.                                 }
  107.                                 *(*(chess2+row)+j) = 1;
  108.                                
  109.                                 EightQueen(row+1, n, chess2);
  110.                         }
  111.                 }
  112.         }
  113.        
  114. }


  115. int main(void)
  116. {
  117.         int chess[8][8], i, j;
  118.        
  119.         for(i = 0; i < 8; i++)
  120.         {
  121.                 for(j = 0; j < 8; j++)
  122.                 {
  123.                         chess[i][j] = 0;
  124.                 }
  125.         }
  126.        
  127.         EightQueen(0, 8, chess);
  128.        
  129.         printf("There are %d number of solutions in total\n\n", count);
  130.        
  131.         return 0;
  132. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-20 23:03:42 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>


  2. int count = 0;

  3. int notDanger(int row, int j, int (*chess)[8])
  4. {
  5.         int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
  6.         // check column
  7.         for(i = 0; i < 8; i++)
  8.         {
  9.                 if( *(*(chess+i)+j) != 0)
  10.                 {
  11.                         flag1 = 1;
  12.                         break;
  13.                 }
  14.         }
  15.        
  16.         // check diagonal left-up
  17.         for(i = row, k = j; i >= 0 && k >= 0; i--, k--)
  18.         {
  19.                 if( *(*(chess+i)+k) != 0 )
  20.                 {
  21.                         flag2 = 1;
  22.                         break;
  23.                 }
  24.         }
  25.        
  26.         // check diagonal right-down
  27.         for(i = row, k = j; i < 8 && k < 8; i++, k++)
  28.         {
  29.                 if( *(*(chess+i)+k) != 0 )
  30.                 {
  31.                         flag3 = 1;
  32.                         break;
  33.                 }
  34.         }
  35.        
  36.         // check diagonal right-up
  37.         for(i = row, k = j; i >= 0 && k < 8; i--, k++)
  38.         {
  39.                 if( *(*(chess+i)+k) != 0 )
  40.                 {
  41.                         flag4 = 1;
  42.                         break;
  43.                 }
  44.         }
  45.        
  46.         // check diagonal left-down
  47.         for(i = row, k = j; i < 8 && k >= 0; i++, k--)
  48.         {
  49.                 if( *(*(chess+i)+k) != 0 )
  50.                 {
  51.                         flag5 = 1;
  52.                         break;
  53.                 }
  54.         }
  55.        
  56.         if( flag1 || flag2 || flag3 || flag4 || flag5 )
  57.         {
  58.                 return 0;
  59.         }
  60.         else
  61.         {
  62.                 return 1;
  63.         }
  64. }
  65.        

  66. // n is col
  67. // row pointer
  68. void EightQueen(int row, int n, int (*chess)[8])
  69. {
  70.         int chess2[8][8], i, j;  // temp chessboard
  71.        
  72.         for(i = 0; i < 8; i++)
  73.         {
  74.                 for(j = 0; j < 8; j++)
  75.                 {
  76.                         chess2[i][j] = chess[i][j];
  77.                 }
  78.         }
  79.        
  80.         // Core recursion
  81.         if(row == 8)
  82.         {
  83.                 printf("%d-th solution\n", count+1);
  84.                 for(i = 0; i < 8; i++)
  85.                 {
  86.                         for(j = 0; j < 8; j++)
  87.                         {
  88.                                 printf("%d ", *(*(chess2+i)+j));
  89.                         }
  90.                         printf("\n");
  91.                 }
  92.                 printf("\n");
  93.                 count++;
  94.         }
  95.         else
  96.         {
  97.                 // Is this a valid position?
  98.                 // If yes, continue...
  99.                 for(j = 0; j < n; j++)
  100.                 {
  101.                         if( notDanger(row, j, chess) ) // valid position?
  102.                         {
  103.                                 for(i = 0; i < 8; i++)
  104.                                 {
  105.                                         *(*(chess2+row)+i) = 0;
  106.                                 }
  107.                                 *(*(chess2+row)+j) = 1;
  108.                                
  109.                                 EightQueen(row+1, n, chess2);
  110.                         }
  111.                 }
  112.         }
  113.        
  114. }


  115. int main(void)
  116. {
  117.         int chess[8][8], i, j;
  118.        
  119.         for(i = 0; i < 8; i++)
  120.         {
  121.                 for(j = 0; j < 8; j++)
  122.                 {
  123.                         chess[i][j] = 0;
  124.                 }
  125.         }
  126.        
  127.         EightQueen(0, 8, chess);
  128.        
  129.         printf("There are %d number of solutions in total\n\n", count);
  130.        
  131.         return 0;
  132. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-20 23:14:38 | 显示全部楼层
本帖最后由 qwertyxxl 于 2018-8-20 23:19 编辑

好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-20 23:17:56 | 显示全部楼层
用的是vs2015
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 23:28:21 | 显示全部楼层

我用 dev c++, dev 行,到哪都行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-26 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表