动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.一步步教你修改CNVBB2.3.0中的联.
.C++的iostream标准库介绍(3).
.C++习题与解析(引用-02).
.词法分析程序.
.Snake.Net中的ORM(三).
.C/C++语言中指向函数的指针.
.C++编译器如何实现异常处理(1).
.通过并行机制处理鼠标和键盘.
.链表的c语言实现(八).
.利用操作系统提供的API编写防火墙.
.理解 C++ Builder&nbs.
.在客户端重新创建对象.
.新手入门:C/C++中枚举类型(enum).
.TList的用法.
.用VC++实现http代理.
.通用线程:POSIX 线程详解(2).
.Windows Socket1.1 程序设计.
.《c语言程序设计》第五章:函数.
.利用 C++Builder 定制系统菜单.
.Win32下两种用于C++的线程同步类.

C程序设计例解(07)

发表日期:2008-3-8 |


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<stdio.h>
#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.\n");
    for(i=0;i<BUCKETS;i++)
        scanf("%d",&full[i]);
    /*如要检查full[0]>full[1]>full[2],相应代码在此*/
    printf("Enter volume of targ.\n");
    scanf("%d",&targ);    /*检查targ<=full[0]的代码在此*/
    /*设置将初始状态存入倒油状态队列等初值*/
    q[0].state[0]=full[0];
    for(i=1;i<BUCKETS;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<BUCKETS&&!found&&!unable;i++)
            if(q[head].state[i]>0)        /*倒出桶有油*/
        /*在还未检查完每个油桶且还未找到解且还未确定无解情况下循环*/
        for(j=0;j<BUCKETS&&!found&&!unable;j++)
            if(j!=i&&q[head].state[j]<full[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)    

上一篇:C程序开发经典实例之5 人气:243
下一篇:C程序设计例解(05) 人气:252
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-7 站长中国企业(公司)网站系统 v4.2
2008-9-7 PBDigg v2.0 Build 20080821
2008-9-7 玩玩小游戏FLASH系统 v2.1
2008-9-7 522QQ在线电视直播程序 v1.1
2008-9-7 Pcook cms 文章管理系统 (老Y CM
2008-9-7 仿代码小说小偷系统 v1.0
2008-9-7 百度一搜集成搜索管理系统
2008-9-7 小贤统计器 v1.0
2008-9-7 UCenter Home-中秋搏饼插件 v1.2
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵