鱼C论坛

 找回密码
 立即注册
查看: 4320|回复: 3

[已解决]求助,八皇后问题的代码的问题

[复制链接]
发表于 2016-10-1 22:14:57 | 显示全部楼层 |阅读模式

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

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

x
求助,这代码为毛错的啊。调试的时候,在notDanger()函数里,row的值居然会减小。
#include <stdio.h>

int num = 0;

int notDanger(int row, int j, int (*chess)[8])
{
    int i, k;
    int flag1=0, flag2=0, flag3=0, flag4=0, flag5=0;

    /// 判断列方向
    for(i=0; i<8; i++)
    {
        if(*(*(chess+i)+j) != 0)
        {
            flag1 = 1;
            break;
        }
    }
    ///判断左上方
    for(i=row, k=j; i>=0 && k>=0; i--, k--)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag2 = 1;
            break;
        }
    }
    ///判断右上方
    for(i=row, k=j; i<8 && k>=0; i++, k--)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag3 = 1;
            break;
        }
    }
    ///判断右下方
    for(i=row, k=j; i<8 && k<8; i++, k++)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag4 = 1;
            break;
        }
    }
    ///判断左下方
    for(i=row, k=j; i>=0 && k<8; i++, k++)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag5 = 1;
            break;
        }
    }
    if(flag1 || flag2 || flag3 || flag4 || flag5)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}



/// 参数row: 表示起始行
/// 参数n:   表示列数
/// 参数(*chess)[8]:  表示指向棋盘每一行的指针
void EightQueen(int row, int n, int (*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种解法为:\n", num);
        for(i=0; i<8; i++)
        {
            for(j=0; j<0; j++)
            {
                printf("%d ", chess2[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        for(j=0; j<n; j++)
        {
            if(notDanger(row, j, chess2))/// 判断是否有危险
            {
                for(i=0; i<8; i++)
                {
                    *(*(chess2+row)+i) = 0;
                }
                *(*(chess2+row)+j) = 1;
                EightQueen(row+1, n, chess2);
            }
        }


    }
}

int main()
{
    int chess[8][8];
    int i, j;

    for(i=0; i<8; i++)
    {
        for(j=0; j<8; j++)
        {
            chess[i][j] = 0;
        }
    }
    EightQueen(0, 0, chess);
    printf("总共有%d解决方法!\n", num);

    return 0;
}
最佳答案
2017-4-25 15:19:39
楼主这里打错了

EightQueen(0, 0, chess);
    printf("总共有%d解决方法!\n", num);

还有这里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-25 15:18:44 | 显示全部楼层
if(8 == row)
    {
        printf("第%d种解法为:\n", num);
        for(i=0; i<8; i++)
        {
            for(j=0; j<0; j++)
            {
                printf("%d ", chess2[i][j]);
            }
            printf("\n");
        }
    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-25 15:19:39 | 显示全部楼层    本楼为最佳答案   
楼主这里打错了

EightQueen(0, 0, chess);
    printf("总共有%d解决方法!\n", num);

还有这里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-30 17:27:32 | 显示全部楼层
///判断右上方
    for(i=row, k=j; i<8 && k>=0; i++, k--)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag3 = 1;
            break;
        }
    }
///判断左下方
    for(i=row, k=j; i>=0 && k<8; i++, k++)
    {
        if(*(*(chess+i)+k) != 0)
        {
            flag5 = 1;
            break;
        }
    }
这两段代码时直接复制的吧,这个是错误的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 23:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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