| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 375 人关注过本帖
标题:求个高手帮我解释一下部分程序
只看楼主 加入收藏
a119744220
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-7-20
收藏
 问题点数:0 回复次数:6 
求个高手帮我解释一下部分程序
求求高手帮帮我吧,我真的很想学好,请帮我解释一下部分程序,谢谢
程序如下
//求八皇后问题所有解

enum boolean {False, True};
enum boolean a[9], b[17], c[17];
int s[9];

#include<stdio.h>

//移去位置(i,j)上的皇后的函数

void movequeen(int i, int j)
{
    a[j] = True;
    b[i+j] = True;
    c[i-j+9] = True;
}


//打印输出一个解的函数

void print()
{
    int k;
    printf("\n行号:   1   2   3   4   5   6   7   8\n");
    printf("列号: ");
    for (k = 1; k<=8; k++)
    {
        printf("%4d",s[k]);
    }
    printf("\n");
}

void main()
{
    void print(), movequeen(), eightqueen(); //函数声明

    eightqueen(); //调用求解八皇后问题
}

void eightqueen()
{
    int i, j;
    for (i = 2; i <= 16; i++)
    {
        if (i>=2 && i<=9)
        {
            a[i-1] = True;
        }
        b[i] = True;
        c[i] = True;
    }
    i = 1;
    j = 1;
    while (i>=1) //当i=0时终止循环
    {
        while (j<=8) //在当前行i上寻找安全位置;
        {
            if (a[j] && b[i + j] && c[i-j+9])
            {
                break;
            }
            j++;
        }
        if (j<=8) //找到安位置(i,j)
        {
            a[j] = False;
            b[i+j] = False;
            c[i-j+9] = False;
            s[i] = j; //皇后位置j入栈
            if (i == 8) //找到一个解,输出解
            {
                print(); //打印输出一个解

                movequeen(i, j); //移去位置(i,j)上的皇后

                i = i - 1;
                j = s[i]; //退栈,回溯到上一个皇后
                movequeen(i, j); //移去位置(i,j)上的皇后

                j++;
            }
            else
            {
                i++;
                j = 1; //准备放置下一个皇后
            }
        }
        else
        {
            i--; //退栈
            if (i>=1) //栈不空,移去皇后
            {
                j = s[i];
                movequeen(i, j); //移去皇后
                j++;
            }
        }
    }
}

问题来了
int i, j;
    for (i = 2; i <= 16; i++)   这里为什么要i=2呢 什么意思 ?  为什么又要i <= 16作为循环条件呢
    {
        if (i>=2 && i<=9) 这里又是什么意思呢
        {
            a[i-1] = True;
        }
        b[i] = True;
        c[i] = True;
    }


有热心人请加下我QQ 119744220

[[it] 本帖最后由 a119744220 于 2009-7-20 21:59 编辑 [/it]]
搜索更多相关主题的帖子: C语言 解释 
2009-07-20 20:33
a119744220
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-7-20
收藏
得分:0 
55555555没人回答我,我明天就要交了,来个人帮帮我吧
2009-07-20 20:39
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这个八皇后里面有个优化。仔细看看回溯部分。很容易看懂的。

提示:C语言的数组是从0开始的,但是这里为了处理方便舍弃了数组的第一个元素,人为认定数组从1开始,又因为是“8”皇后,所以棋盘的行列号的范围都是1~8.

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-07-20 20:52
a119744220
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-7-20
收藏
得分:0 
回复 3楼 StarWing83
大哥我是初学者,只会简单的,这个程序我看了好久了都还没明白是怎么回事,真的很痛苦呀!如果没有优化的话程序是怎么样的呢?可否帮改下未优化前的样子,这样我容易理解点!

[[it] 本帖最后由 a119744220 于 2009-7-20 20:58 编辑 [/it]]
2009-07-20 20:57
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
没有优化的话代码会更长,效率也稍微差些。这个优化还是满不错的,是用空间换取时间。你可以用单步调试的方法,一条语句一条语句地运行这个程序,看看他究竟是怎么执行的,多看几遍就明白了。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-07-20 21:08
a119744220
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-7-20
收藏
得分:0 
以下是引用StarWing83在2009-7-20 21:08的发言:

没有优化的话代码会更长,效率也稍微差些。这个优化还是满不错的,是用空间换取时间。你可以用单步调试的方法,一条语句一条语句地运行这个程序,看看他究竟是怎么执行的,多看几遍就明白了。



我看懂一点了,虽然不完全明白,但是还是非常感谢你!
2009-07-20 22:57
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
可以说说你的理解,看看有没有什么偏差。

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-07-21 05:56
快速回复:求个高手帮我解释一下部分程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020156 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved