?? 農夫過河.txt
字號:
【題目】農夫過河。一個農夫帶著一只狼,一只羊和一些菜過河。河邊只有一條一船,由
于船太小,只能裝下農夫和他的一樣東西。在無人看管的情況下,狼要吃羊,羊
要吃菜,請問農夫如何才能使三樣東西平安過河。
【算法分析】
將問題數字化。用1代表狼,2代表羊,3代表菜。則在河某一邊物體的分布有以下
8種情況。
┏━━━━┯━┯━━━━━┯━━━━━━━━┯━━━┓
┃物體個數│0│ 1 │ 2 │ 3 ┃
┠────┼─┼─┬─┬─┼──┬──┬──┼───┨
┃分布情況│0│1│2│3│1,2 │1,3 │2,3 │1,2,3 ┃
┠────┼─┼─┼─┼─┼──┼──┼──┼───┨
┃代碼之和│0│1│2│3│3 │ 4 │ 5 │ 6 ┃
┠────┼─┼─┼─┼─┼──┼──┼──┼───┨
┃是否相克│ │ │ │ │相克│ │相克│ ┃
┗━━━━┷━┷━┷━┷━┷━━┷━━┷━━┷━━━┛
當(兩物體在一起而且)代碼和為3或5時,必然是相克物體在一起的情況。
【參考程序】
const
wt:array[0..3]of string[5]=(' ', 'WOLF ','SHEEP','LEAVE');
var left,right:array[1..3] of integer ;
what,i,total,left_rest,right_rest:integer;
procedure print_left; {輸出左岸的物體}
var i:integer;
begin
total:=total+1;
write('(',total,')'); {第幾次渡河}
for i:=1 to 3 do write(wt[left[i]]);
write('|',' ':4);
end;
procedure print_right;{輸出右岸的物體}
var i:integer;
begin
write(' ':4,'|');
for i:=1 to 3 do if right[i]<>0 then write(wt[right[i]]);
writeln;
end;
procedure print_back(who:integer); {右岸矛盾時,需從右岸捎物體→左岸}
var i:integer;
begin
for i:=1 to 3 do begin
if not ((i=who) or (right[i]=0)) then begin
{要捎回左岸的物體不會時剛剛從左岸帶來的物體,也不會是不在右岸的物體}
what:=right[i];
right[i]:=0;
print_left; {輸出返回過程}
write('<-',wt[i]);
print_right;
left[i]:=what; {物體到達左岸}
end;
end;
end;
begin
total:=0;
for i:=1 to 3 do begin left[i]:=i; right[i]:=0;end;
repeat
for i:=1 to 3 do {共有3種物體}
if left[i]<>0 then {第I種物體在左岸}
begin
what:=left[i];left[i]:=0; {what:放置將要過河的物體編號}
left_rest:=left[1]+left[2]+left[3]; {求左岸剩余的物體編號總和}
if (left_rest=3) or (left_rest=5) then left[i]:=what
{假如左岸矛盾,則不能帶第I種過河,嘗試下一物體}
else {否則可帶過河}
begin print_left; {輸出過河過程}
write('->',wt[i]);
print_right;
right[i]:=what; {物體到達右岸}
if left_rest=0 then halt; {左岸物體已悉數過河}
right_rest:=right[1]+right[2]+right[3];
{求右岸剩余的物體編號總和}
if (right_rest=3)or(right_rest=5) then print_back(i)
{右岸有矛盾,要捎物體回左岸}
else begin print_left; {右岸有矛盾,空手回左岸}
write('<-',' ':5);
print_right;
end;
end;
end;
until false; {不斷往返}
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -