[算法习题] 1.人、狗、鸡、米过河的问题

耙子 2003-12-16 05:32:02
Delphi 版面现在革命的气氛洋溢。作为老虫子,率先起起哄。
从一些简单的智力题让大家从中体会到 算法的重要。

老题目:《人、狗、鸡、米过河的问题》

话说csdn老鸟猛禽要带一条狗、一只鸡、一袋子米过河,
但小船只有猛禽划外,最多只能载一样东西过河,而当猛禽不在场时,狗要吃鸡、鸡要吃米。
请大家告诉猛禽该如何过河?
输入条件
Raptor,DOG, HEN,RICE

注:
1.猛禽不是禽,是csdn 中的delphi版的老鸟:)
2.题目可以用pascal, C完成,但必须是控制台程序(Console Application),因为这样便于大家测试;(c我能看得懂,大家呢?)
3.程序逻辑清晰,注释得当;
4.贴出程序之前必须先清晰地阐述算法;
5.建议大家独立思考,不要到网上找现成的答案;
6.第一个给出大家公认的正确答案的,赏100分;
7.给出最有大家认可的最优算法的赏100分;
8.分可以兼得。

希望大家捧场。
...全文
1050 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaoqingpeng 2003-12-20
  • 打赏
  • 举报
回复
up
myling 2003-12-17
  • 打赏
  • 举报
回复
伴水已经写的很好了

俺自问写不过他

嘿嘿,就不浪费时间了
myling 2003-12-17
  • 打赏
  • 举报
回复
如果只是针对这个问题的话
Go('猛鸟','鸡');
Back('猛鸟');
Go('猛鸟','狗');
Back('猛鸟','鸡');
Go('猛鸟','米');
Back('猛鸟');
Go('猛鸟','鸡');

这样行吗?

嘿嘿
myling 2003-12-17
  • 打赏
  • 举报
回复
有种你加我呀?哈哈哈

我得意的笑我得意的笑
forgetter 2003-12-17
  • 打赏
  • 举报
回复
AD你有种写个程序出来,从现在开始计时,看谁狠,敢不敢!
耙子 2003-12-17
  • 打赏
  • 举报
回复
绯村 的思路是正确的,建模比较对,不过我以前写的和伴水的一样,因为它好理解。
littlevoice 2003-12-17
  • 打赏
  • 举报
回复
我觉得绯村的思路才是最正确的,上学时图论老师就提出过用最短路径的想法来解决这个问题,无奈当时习惯copy作业,都没仔细思考
现在正在思考ing。。。。。
应该往这方向想才对
forgetter 2003-12-17
  • 打赏
  • 举报
回复
死AD,臭AD,烂AD,让我今天迟到10分钟
gencan 2003-12-17
  • 打赏
  • 举报
回复
我认为我的思路是最好的,不信你好好想想!!!!!
gencan 2003-12-17
  • 打赏
  • 举报
回复
哈哈:
你说的是算法,为什么非要完整的。
其实搞软件重在思想,为什么非要代码不行呢?
耙子 2003-12-17
  • 打赏
  • 举报
回复
gencan(无敌)
你自己写一个完整的呀!
1nsc 2003-12-17
  • 打赏
  • 举报
回复
在绿盟论坛上http://www.0mai.com/bbs/down_default.asp 有这问题的说明
http://www.0mai.com/bbs上有说明
我的OICQ:9199333
Shiyl 2003-12-17
  • 打赏
  • 举报
回复
好强!
myling 2003-12-17
  • 打赏
  • 举报
回复
forgetter()

你只是迟到10分钟

我昨晚喝的滥醉,还跟你折腾到半夜

今天上午旷工半天!!

我睡到12:30

:(
gencan 2003-12-17
  • 打赏
  • 举报
回复
怎么没人用我的思路呀!我认为我的是最简单的!!!!!!!!!!!!!!!!!
耙子 2003-12-17
  • 打赏
  • 举报
回复
forgetter()
你居然能把程序写成这样!!!!!!!
我服了,有点像那个不同水平的高手写"hello world"的例子。

这程序不完整呀!

我去睡觉了,明天接着看,
forgetter 2003-12-17
  • 打赏
  • 举报
回复
妈的,老子被你AD害死了
type
TADClass = class of TAD;
TAD = class //为报复AD
private
FFoeClassName: string;
public
constructor Create(AFoeClassName: string);
function IsRaptor: Boolean; virtual; abstract;
function IsFoe(AAD: TAD): Boolean; virtual;
end;

TADRaptor = class(TAD)
public
constructor Create;
function IsRaptor: Boolean; override;
end;

TADDog = class(TAD)
public
constructor Create;
function IsRaptor: Boolean; override;
end;

TADHen = class(TAD)
public
constructor Create;
function IsRaptor: Boolean; override;
end;

TADRice = class(TAD)
public
constructor Create;
function IsRaptor: Boolean; override;
end;

TSite = class
private
FADList: TList;
public
constructor Create;
destructor Destroy; override;
function AddAD(AAD: TAD): Boolean;
function RemoveAD(AAD: TAD): Boolean;
end;

TBoat = class(TSite)
private
function CanMove: Boolean;
public
procedure Move;
end;

---------------------------


constructor TAD.Create(AFoeClassName: string);
begin
FFoeClassName := AFoeClassName;
end;

function TAD.IsFoe(AAD: TAD): Boolean;
begin
Result := AAD.ClassNameIs(FFoeClassName);
end;

{ TRaptor }

constructor TADRaptor.Create;
begin
inherited Create('');
end;

function TADRaptor.IsRaptor: Boolean;
begin
Result := True;
end;

{ TADDog }

constructor TADDog.Create;
begin
inherited Create('');
end;

function TADDog.IsRaptor: Boolean;
begin
Result := False;
end;

{ TADHen }

constructor TADHen.Create;
begin
inherited Create('TADDog');
end;

function TADHen.IsRaptor: Boolean;
begin
Result := False;
end;

{ TADRICE }

constructor TADRice.Create;
begin
inherited Create('TADHen');
end;

function TADRice.IsRaptor: Boolean;
begin
Result := False;
end;


{ TSite }
constructor TSite.Create;
begin
FADList := TObjectList.Create(True);
end;

destructor TSite.Destroy;
begin
FADList.Clear;
FADList.Free;
end;

function TSite.AddAD(AAD: TAD): Boolean;
var
I: Integer;
begin
Result := False;

for I := 0 to FADList.Count - 1 do
begin
if TAD(FADList[I]).ClassNameIs(AAD.ClassName) then
raise Exception.Create('已经加入')
else
if TAD(FADList[I]).IsRaptor then
begin
Result := True;
Break;
end
else if TAD(FADList[I]).IsFoe(AAD) then
raise Exception.Create('不能加入');
end;
if (FADList.Count = 0) or (I = FADList.Count - 1) then
Result := True;
if Result then
begin
FADList.Add(AAD);
Result := True;
end;
end;


function TSite.RemoveAD(AAD: TAD): Boolean;
var
I, J: Integer;
iIndex: Integer;
bHasRaptor: Boolean;

function GetIndex: Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to FADList.Count - 1 do
if TAD(FADList[I]).ClassNameIs(AAD.ClassName) then
begin
Result := I;
Break;
end;
end;

begin
Result := False;
iIndex := GetIndex;

bHasRaptor := False;
for I := 0 to FADList.Count - 1 do
begin
if I = iIndex then continue;
if TAD(FADList[I]).IsRaptor then
bHasRaptor := True;
end;
if bHasRaptor then
Result := True
else begin
for I := 0 to FADList.Count - 1 do
begin
for J := 0 to FADList.Count - 1 do
begin
if (I = J) or (I = iIndex) or (J = iIndex) then continue;
if TAD(FADList[I]).IsFoe(TAD(FADList[J])) then
raise Exception.Create('不能退出');
end;
end;
end;

if Result then
FADList.Remove(AAD);
end;

{ TBoat }

function TBoat.CanMove: Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to FADList.Count - 1 do
begin
if TAD(FADList[I]).IsRaptor then
begin
Result := True;
Break;
end;
end;
if Result then
Result := Result and (FADList.Count > 0)
and (FADList.Count < 4);
end;

procedure TBoat.Move;
begin
if not CanMove then
raise Exception.Create('不能移动');

end;
耙子 2003-12-17
  • 打赏
  • 举报
回复
伴水用的是回溯,用别的大家写一个
myling 2003-12-16
  • 打赏
  • 举报
回复
哈哈哈哈

今天是真爽呀


我得意的笑我得意的笑
forgetter 2003-12-16
  • 打赏
  • 举报
回复
妈的,拿老子开心,今天面子丢大了
加载更多回复(38)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧