• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
计算机二级:C程序设计例解(06)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
计算机二级:C程序设计例解(06)
软件发布 计算机二级:C程序设计例解(06)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 认证考试 >> 计算机等级考试 >> 计算机二级考试 >> 计算机二级:C程序设计例解(06)

计算机二级:C程序设计例解(06)

添加时间: 2007-5-5 5:59:03  作者: 计算机等级考试认证参考  阅读次数:77   来源: http://www.d9soft.com

       

 
06.设有大小不等的X,Y,Z三个无刻度的油桶,分别能够盛满油X,Y,Z(例如,X=80,Y=50,Z=30),并约定X>Y>Z。初始时,仅X油桶盛满油,Y和Z油桶为空。要求程序寻找一种最少的分油步聚,在某个油桶中分出T升油(例如T=40)。
解:
    令三个油桶的盛油情况为倒油过程的状态,则倒油过程就是状态变化的过程。为了记录倒油过程,程序引入倒油状态队列,将倒油过程中产生的状态存储在队列中。队列的每个元素记录每次分油后各个油桶的分油后各个油桶的盛油量和倒油轨迹等有关信息。程序反复从队列中取出第一个还未 检查 过的状态,对该状态下的每个油桶判断其是否可以倒出油,及是否可以倒进油。由于油桶没有刻度,分油时只能将某个油桶倒满或倒空。程序分别按倒空或倒满两种可能的倒油动作执行不同的处理,产生新的倒油状态,为避免某个倒油状态在队列中重复出现,程序只将未曾出现过的新状态及其倒油轨迹信息存入队列中,假定程序检查了相当多的状态后,或能找到解,或能确定问题无解。

倒油程序算法如下:
算法---无刻度油桶分油
{
    输入各桶容量和目标容量;
    将初始状态存入倒油状态队列;
    设置其它初始值;
    do
    {
        对状态队列中第一个还未检查的元素
            在还未检查完每个倒出的桶且还未找到解且还未确定无解情况下循环
        if(倒出桶有油)
            在还未检查完每个桶且还未找到解且还未确定无解情况下循环
                if(当前桶不是倒出桶且桶还有空)
                {
                    确定本次倒油量;
                    在队列中检查倒油后的结果状态是否在队列中出现;
                    if(结果状态不在队列中出现)
                    {
                        将结果状态和轨迹信息存入队列;
                        if(有桶中的油达到目标容量)
                            设置找到解标志;
                    }
                }
        if(还未找到解)
        {        
            修正队列第一个还未检查过的元素指针;
            if(队列中的元素都已检查过)
                设置无解标志;
        }
    }while(还未找到解且还未确定无解);
    if(找到解)
    {

    根据倒油步聚的轨迹信息,形成倒油步聚序列;
        输出倒油步聚序列;
    }
}
倒油队列中的元素应包含下列信息:各桶的盛油量,该状态是从哪一个桶(源桶)倒向哪一个桶(目标桶)而形成的,形成该状态的元素在队列中的位置。根据以上算法编写如下程序。

程序代码如下:
#include
#define N 100
#define BUCKETS 3
struct ele{
    int state[BUCKETS];        /*各桶盛油量*/
    int sbucket;               /*源桶*/
    int obucket;               /*目标桶*/
    int last;                  /*轨迹元素在队列中的下标*/
}q[N];            /*队列*/
int full[BUCKETS];
int i,j,k,found,unable,wi,wj,v,targ;
int head,tail;
void main()
{
    /*输入各桶容量和目标容量*/
    printf("Enter volume of buckets. ");
    for(i=0;i        scanf("%d",&full[i]);
    /*如要 检查 full[0]>full[1]>full[2],相应代码在此*/
    printf("Enter volume of targ. ");
    scanf("%d",&targ);    /*检查targ<=full[0]的代码在此*/
    /*设置将初始状态存入倒油状态队列等初值*/
    q[0].state[0]=full[0];
    for(i=1;i        q[0].state[i]=0;
    q[0].sbucket=0;
    q[0].obucket=0;
    q[0].last=0;
    found=unable=0;
    head=tail=0;
    do
    {
        /*对状态队列中第一个还未检查过的元素在还未检查完每个倒出的桶
          且还未找到解且还未确定无解情况下循环*/
        for(i=0;i            if(q[head].state[i]>0)        /*倒出桶有油*/
        /*在还未检查完每个油桶且还未找到解且还未确定无解情况下循环*/
        for(j=0;j            if(j!=i&&q[head].state[j]            {   /*当前桶不是倒出桶且桶还有空*/
                /*确定本次倒油量*/
                if(q[head].state[i]>full[j]-q[head].state[j])
                    v=full[j]-q[head].state[j];
                else v=q[head].state[i];
                wi=q[head].state[i]-v;
                wj=q[head].state[j]+v;
                /*在队列中检查倒油后的结果状态是否在队列中出现*/
                for(k=0;k<=tail;k++)
                    if(q[k].state[i]==wi&&q[k].state[j]==wj) break;
                if(k>tail)        /*结果状态不在队列中出现*/
                {
                    /*将结果状态和轨迹信息存入队列*/
                    tail++;
                    q[tail].state[i]=wi;
                    q[tail].state[j]=wj;
                    q[tail].state[3-i-j]=q[head].state[3-i-j];
                    q[tail].sbucket=i+1;
                    q[tail].obucket=j+1;
                    q[tail].last=head;
                    /*如有桶达到目标盛油量,则设置找到解标志*/
                    if(wi==targwj==targ)found=1;
                }
            }
        if(!found)        /*还未找到解*/
        {
            head++;        /*修正队列第一个还未检查过元素指针*/
            if(head>tail)    /*队列中的元素都已检查过*/
                unable=1;        /*设置无解标志*/
        }
    }while(!found&&!unable);        /*还未找到解且还未确定无解*/
    if(found)        /*找到解*/
    {
        /*根据倒油步聚的轨迹信息,形成倒油步聚序列*/
        i=tail;
        j=-1;
        do        /*原倒油步聚逆向链接,现改为正向链接*/
        {
            k=q[i].last;
            q[i].last=j;
            j=i;
            i=k;
        }while(j);
        /*输出倒油步聚序列*/
        for(k=q[k].last;k>=0;k=q[k].last)
        {
            printf("] to -:",q[k].sbucket,q[k].obucket);
            for(i=0;i                printf("M",q[k].state[i]);
            printf(" ");
        }
    }
    else printf("Unable! ");
}

 

上下文章:

 

上一篇文章: 计算机二级:C程序设计例解(07) 下一篇文章: 计算机二级:C程序设计例解(05)

相关文章:

  • 中国国家计算机病毒中心监测发现蠕虫新变种
  • 09年全国计算机等级考试更新7门教材
  • 确保计算机安全 个人用户责无旁贷
  • 计算机病毒中心:重视微软高危漏洞补丁程序
  • 微软第二代超级计算机版Windows发布在即

相关软件:

  • 二级VB学习系统 1.0
  • 计算机等级考试训练模拟软件(三级数据库技术) V1.01
  • C/C++程序设计学习与实验系统 2008.14
  • 全国计算机等级考试二级VFP上机考试模拟 V1.0
  • 全国计算机等级考试模拟软件(2006年全年使用)二级Visual Basic V9.0
  • 全国计算机等级考试第21次全真模拟系统 20050311

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

计算机等级考试分类导航

  • 计算机等级考试动态
  • 计算机一级考试
  • 计算机二级考试
  • 计算机三级考试
  • 计算机四级考试

本类经典文章推荐

  • 2006年全国计算机等级考试二级C考...
  • 《C++编程规范》笔记(设计风格)
  • 如何编写高质量的VB代码
  • VB编程的几个API函数的应用问题
  • VB编程:去掉窗体的关闭按钮
  • 最简Windows编程
  • VB编程:如何在列表框中自动查找
  • VB指导:生成auto-OK对话框
  • 使用VB的布局工具节省编程时间
  • VB中利用Winrar进行文件压缩

计算机二级考试阅读排行

  • 计算机二级:《计算机基础》考试题
  • 2006年全国计算机等级考试二级C考...
  • VB编程:去掉窗体的关闭按钮
  • 计算机二级:计算机基础知识作业题
  • 二级VF程序设计全真预测试卷(一)
  • 全国计算机等级考试二级VISUALFOX...
  • 2005年9月17日二级VF笔试试题答案
  • 《C++编程规范》笔记(设计风格)
  • 二级C语言程序设计试题(含答案)
  • 2005年9月计算机等级考试二级笔试...

计算机等级考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题07
  • 一级(WINDOWS)试题解析-Word篇
  • 全国计算机等级考试上机考试应试技...
  • 全国计算机等级考试一级模拟试题03
  • 全国计算机等级考试一级模拟试题06

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有