douxy 发表于 2021-10-23 17:25:11

求助、八皇后问题,运行不出结果


求助、八皇后问题,运行不出结果
#include <stdio.h>
#include <stdlib.h>

typedef int bool;
#define true 1
#define false 0
int num=0;
char m={'*'};


bool Check(int row,int column){
        int i,j;
        if(row==1)return true;
        for(i=0;i<=row-2;i++){
                if(m=='Q')return false;
        }
        i=row-2;
        j=i-(row-column);
        while(i>=0&&j>=0)
        {
                if(m=='Q')return false;
                i--;
                j--;
        }
        i=row-2;
        j=row+column-i+2;
        while(i>=0&&j<=7){
                if(m='Q')return false;
                        i--;
                        j++;
        }
        return true;
}
void Output(void){
        int i,j;
        num++;
        printf("可行解%d:\n",num);
        for(i=0;i<8;i++){
                for(j=0;j<8;j++){
                        printf("%c",m);
                }
                printf("\n");
        }
}
void EightQueen(int row){
        int j;
        for(j=0;j<8;j++){
                m='Q';
                if(Check(row,j+1)==true){
                        if(row==8)Output();
                        else EightQueen(row+1);
                }
                m='*';
        }
}
void main(void){
        EightQueen(1);
}
















jhq999 发表于 2021-10-23 18:43:26

本帖最后由 jhq999 于 2021-10-23 18:47 编辑

if(m='Q')return false;
                        i--;
                        j++;
if(m=='Q')return false;//是==不是=
建议以后先写值后写变量:
if('Q'==m)return false;//是==不是=

傻眼貓咪 发表于 2021-10-23 18:59:23

#include <stdio.h>
#define QUEENS 8
#define IS_OUTPUT 1

int A, B, C, k;
int inc, * a = A, * b = B + QUEENS, * c = C;
void lay(int i) {
    int j = 0, t, u;

    while (++j <= QUEENS)
      if (a + b + c == 0) {
            k = a = b = c = 1;
            if (i < QUEENS) lay(i + 1);
            else {
                ++inc;
                if (IS_OUTPUT) {
                  for (printf("(%d)\n", inc), u = QUEENS + 1; --u; printf("\n"))
                        for (t = QUEENS + 1; --t; ) k ? printf("Q ") : printf("+ ");
                  printf("\n\n\n");
                }
            }
            a = b = c = k = 0;
      }
}

int main(void) {
    lay(1);
    printf("%d皇后共计%d个解\n", QUEENS, inc);
    return 0;
}

jhq999 发表于 2021-10-23 19:14:18

傻眼貓咪 发表于 2021-10-23 18:59


不写注释都是耍流氓{:5_104:}

傻眼貓咪 发表于 2021-10-23 19:52:10

jhq999 发表于 2021-10-23 19:14
不写注释都是耍流氓

是全部都不懂呢?还是某些代码不懂?都是些基础代码,没有用到任何深入复杂代码啊?如果是全部都不懂,温馨建议从零学起,如果只是思路不明白,可以共同学习。{:10_249:}

jhq999 发表于 2021-10-23 20:08:57

傻眼貓咪 发表于 2021-10-23 19:52
是全部都不懂呢?还是某些代码不懂?都是些基础代码,没有用到任何深入复杂代码啊?如果是全部都不懂,温 ...

开个玩笑

傻眼貓咪 发表于 2021-10-23 20:15:40

jhq999 发表于 2021-10-23 20:08
开个玩笑

#include <stdio.h>
#define QUEENS 8

int A, B, C, k; // 定义棋盘大小,用于存储皇后位置
int inc, * a = A, * b = B + QUEENS, * c = C; // 定义棋盘边界大小(b 比原棋盘大,主要是为了方便出界计算)

void lay(int i)
{
    int j = 0, t, u;
    while (++j <= QUEENS) // j 为预设所有皇后位置
      if (a + b + c == 0){
            
            k = a = b = c = 1; // 真正皇后位置,1 表示该位置存在皇后,0表示该位置不存在皇后
            
            if (i < QUEENS) lay(i + 1); // 递归函数,参数 i+1,计算出新可能
            else
            {
                ++inc; // 多少个解法
               
                /*----------------- 开始打印结果 -----------------*/
                for (printf("(%d)\n", inc), u = QUEENS + 1; --u; printf("\n"))
                for (t = QUEENS + 1; --t; )
                k ? printf("Q ") : printf("+ "); // 棋盘位置,Q 表示该位置存在皇后,+ 表示该位置为空
                printf("\n\n\n");
            }
            a = b = c = k = 0; // 如果位置不符合皇后,则赋值 0,继续循环下一个位置
      }
}

int main(void) {
    lay(1); // 从位置 1 开始预设所有皇后位置
    printf("%d皇后共计%d个解\n", QUEENS, inc);
    return 0;
}

桃花飞舞 发表于 2021-10-24 10:25:06

本帖最后由 桃花飞舞 于 2021-10-24 11:02 编辑

抱歉没看你的代码,我来讲下思路吧下来的图



图上面只考虑当前皇后一下面一半的因为有一半还没有放皇后,也就是说只考虑左下、正下、右下三个方向。
说白了就是一个递归的思想。xxx那行的弯曲箭头是考虑当前行不能放皇后,就回到上一行的情况。
下面是代码
------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#define N 8

typedef struct _tag_Pos
{

        int ios;
        int jos;
}Pos;

static char board;
static Pos pos[]={{-1,-1},{-1,0},{-1,1}};
static int count=0;

void init()    //初始化棋盘
{       
        int i = 0;
        int j = 0;
        for( i=0; i<N+2; i++)
        {
                board = '#';
                board = '#';
                board = '#';
                board = '#';
        }
        for ( i=1; i<=N; i++)
        {
                for (j=1; j<=N; j++)
                {
                        board = ' ';
                }
        }
}

int check(int i, int j) //核对有没有和别的皇后冲突
{
        int ret =1;
        int p = 0;

        for (p=0;p<3;p++)
        {
                int ni = i;
                int nj = j;

                while( ret && (board) != '#')
                {
                        ni = ni + pos.ios;
                        nj = nj + pos.jos;

                        ret = ret && (board != '*');
                }
        }
        return ret;
}

void display()   //显示出棋盘和皇后的结果
{
        int i = 0;
        int j = 1;
       
        for(i=0; i<N+2; i++)
        {
                for (j=0;j<N+2;j++)
                {
                        printf("%c", board);
                }
                printf("\n");
        }
}



void find(int i)//如果i>N就是到了棋盘边界,就display()显示出结果,否则就继续查找新的结果
{
        int j = 0;

        if ( i> N )
        {
                count++;
               
                printf("Solution: %d\n", count);

                display();

                getchar();
        }
        else
        {
                for(j=1; j<=N; j++)
                {
                        if( check(i, j) )
                        {
                                board = '*';

                                find(i+1);

                                board = ' ';
                        }
                }
        }
}


int main()
{
        init();
       
        find(1);
        return 0;
}
页: [1]
查看完整版本: 求助、八皇后问题,运行不出结果