| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 966 人关注过本帖
标题:一个很复杂的问题,本人自已做出来了!望大家提提意见!
只看楼主 加入收藏
一尛星一
Rank: 2
来 自:湖北孝感
等 级:论坛游民
帖 子:41
专家分:49
注 册:2009-10-17
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
一个很复杂的问题,本人自已做出来了!望大家提提意见!
本人刚学C++不久,望大家多多指教!
有三个商人和三个奴隶要过河!但只有一条船!!!每次只能坐两个人!奴隶协议,奴隶不管在哪边,如果比商人多就把商人杀掉!请问商人要怎么安排过河!(可以坐两个人,也可以做一个人,记得船要来回,别过去了就不用个人划回来)……


开始的方案有三种A.商人\
和奴隶B.商人和商人C.奴隶和奴隶,先执行B方案是绝对不行的(一边奴隶大于商人)\
那么就只剩A,B方案了,实际上A,B方案都可以!我们这里是执行A方案!商人和奴隶\
过去后当然还要把个人把船划过来,用奴隶划过来商人就死了,所以就只有商人划了\
商人过来后,就只能划两个奴隶过去了!过去后再派个奴隶把船划过来,让两个商人过\
去再划过来一个商人和一个奴隶,现在对岸有商人和奴隶各一个,这边有商人和奴隶各\
两个,接着派两个商人过去,一个奴隶划过来,在过去连个奴隶,再过来一个,在过去\
两个!大家可以拿六个物品代替的试一下!
(注:“O”代表商人!“X”代表奴隶!)


#include<iostream>
#include<string>
#include<conio.h>
void up();
void down();
void execute();
void decide();
void victory();

int man=3;
int XX=0;
int businessman_up=man,businessman_down=0,slave_up=man,slave_down=0;
int &b_u=businessman_up,&b_d=businessman_down,&s_u=slave_up,&s_d=slave_down;
const string businessman="O",slave="X";

void up()
{
    victory();    //判断是否完成
    ++XX;
    if(b_u>=2&&s_d!=0){    //判断商人是否符合过河条件
        b_u=b_u-2,b_d=b_d+2;
        decide();
        b_u=b_u+2,b_d=b_d-2;
    }
    if(b_u>=1&&b_d!=0){    //判断商人是否符合过河条件
        b_u=b_u-1,b_d=b_d+1;
        decide();
        b_u=b_u+1,b_d=b_d-1;
    }
    if(b_u>=1&&s_u>=1){    //判断商人和奴隶是否符合过河条件
        b_u=b_u-1,b_d=b_d+1,s_u=s_u-1,s_d=s_d+1;
        decide();
        b_u=b_u+1,b_d=b_d-1,s_u=s_u+1,s_d=s_d-1;
    }
    if(s_u>=1)    ;    //判断奴隶是否符合过河条件
    if(s_u>=2&&b_d!=1){    //判断奴隶是否符合过河条件
        s_u=s_u-2,s_d=s_d+2;
        decide();
        s_u=s_u+2,s_d=s_d-2;
    }
}
void down()
{
    victory();
    --XX;
    if(s_d>=2);    //判断奴隶是否符合过河条件
    if(s_d>=1){    //判断奴隶是否符合过河条件
        s_u=s_u+1,s_d=s_d-1;
        decide();
        s_u=s_u-1,s_d=s_d+1;
    }
    if((b_d>=1&&s_d>=1)&&(b_d-1!=0&&s_d-1!=0)){    //判断商人和奴隶是否符合过河条件
        b_u=b_u+1,b_d=b_d-1,s_u=s_u+1,s_d=s_d-1;
        decide();
        b_u=b_u-1,b_d=b_d+1,s_u=s_u-1,s_d=s_d+1;
    }
    if(b_d>=1){    //判断商人是否符合过河条件
        b_u=b_u+1,b_d=b_d-1;
        decide();
        b_u=b_u-1,b_d=b_d+1;
    }
    if(b_d>=2){    //判断商人是否符合过河条件
        b_u=b_u+2,b_d=b_d-2;
        decide();
        b_u=b_u-2,b_d=b_d+2;
    }
}
void decide()    //判断过河后是否符合游戏条件
{
    if(b_u>=s_u&&b_d>=s_d)    execute();
    if(b_u==0&&b_d>=s_d)    execute();
    if(b_d==0&&b_u>=s_u)    execute();   
}
void execute()        //输出
{
    for(int i=0;i!=b_u;++i)
        std::cout<<businessman<<" ";
    for(int i=0;i!=s_u;++i)
        std::cout<<slave<<" ";
    std::cout<<"\n************\n";
    for(int i=0;i<b_d;++i)
        std::cout<<businessman<<" ";
    for(int i=0;i<s_d;++i)
        std::cout<<slave<<" ";
    std::cout<<"\n\n";            
    if(XX==1)
        down();
    else up();
}
void victory()    //判断是否完成
{
    if(b_u==0&&s_u==0)
        exit(0);
}
int main()
{
    execute();
    return 0;
}
搜索更多相关主题的帖子: 意见 
2009-12-24 08:25
wuchun88
Rank: 1
等 级:新手上路
帖 子:4
专家分:3
注 册:2009-12-25
收藏
得分:3 
很好,很强大呀
能否帮我写个实验呢
感激不尽啊
用类和对像标准C++方法,实现动态数据表的构建和保存
二.实验目的要求:
     1. 熟练掌握类、对象、成员函数的定义和应用方法。
     2. 要求用对象和构造函数初始化数据。
     3. 输入员工的基本信息,包括身份证号、姓名、性别、出生年月日、地址、工资。将300名员工的基本
信息逐条输入并保存到某盘当中
4. 为期末综合实验做第二阶段准备
三.实验报告要求
实验报告用电子文档形式提交,但实验报告内容按实验报告纸的具体要求执行:
(1) 除了写明实验目的要求、内容步骤和代码外;
(2) 实验报告必须有实验结果数据
(3) 要有对本实验内容的认识分析,即本实验设计我作了哪些改进,或还可以作哪些改进,或对比较难的某些语句的认识;
(4) 透过实验结果分析本程序的不足之处。
提示:用类的方法定义员工信息;用成员函数解决输入输出方法的操作,保存到某一盘中,还要能读出盘中文档数据.。
2009-12-25 16:00
英英
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:133
注 册:2009-3-3
收藏
得分:3 
呵呵 ,不错嘛,我除了老师安排的程序外,平时都很少编的,不管怎样,楼主的精神可加啊
看了看分析,觉得那个要是没问题的话,程序肯定也不会有太大问题吧,我想楼主您肯定已经运行过了吧
呵呵,没太仔细看,但是如果是标准输入输出流的话,应该不用在cin和cout前加上名空间了吧
看来以后我还得像楼主学习学习,得多动手才行啊
2009-12-25 21:50
yangliangbin
Rank: 2
来 自:广西
等 级:论坛游民
帖 子:66
专家分:62
注 册:2009-6-3
收藏
得分:3 
改正几个错误:
一、头文件部分加上using namespace std;
二、void up()函数体中倒数第二个if语句去掉,好像是多余的
三、execute()函数体中第一个for语句的i定义。。。其他for语句中就不要再定义了。。去掉i前面的int吧。。。

相信自已……
2009-12-28 16:33
秀痘魔导士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:250
专家分:1150
注 册:2009-12-23
收藏
得分:3 
以下是引用yangliangbin在2009-12-28 16:33:31的发言:

改正几个错误:
一、头文件部分加上using namespace std;
二、void up()函数体中倒数第二个if语句去掉,好像是多余的
三、execute()函数体中第一个for语句的i定义。。。其他for语句中就不要再定义了。。去掉i前面的i ...
1.std::
不需要using

3.作用域问题,i的作用域只在for 中存在,你弄错了

有些概念问题,自己跑一下,这里可能新手比较多,不要误导了


[ 本帖最后由 秀痘魔导士 于 2009-12-28 16:39 编辑 ]
2009-12-28 16:34
forclwy
Rank: 4
等 级:业余侠客
帖 子:167
专家分:255
注 册:2008-10-21
收藏
得分:3 
很好啊,仔细看看
2009-12-28 20:47
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
赞同 秀痘魔导士 的说法。
使用 std:: 是比 using 语句更值得推荐的写法(using std::cout 这样的倒是好一些)。原因什么的当然也很多了,使用 using 只是方便都练习了~
2009-12-29 14:41
一尛星一
Rank: 2
来 自:湖北孝感
等 级:论坛游民
帖 子:41
专家分:49
注 册:2009-10-17
收藏
得分:0 
谢谢大家的支持!!!
2010-01-05 08:57
快速回复:一个很复杂的问题,本人自已做出来了!望大家提提意见!
数据加载中...
 
   



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

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