ACM经典算法(2)

2019-01-19 12:34

end;

function nrep(k:integer):boolean; var

i,x,y:integer; f:boolean; begin

nrep:=false;

for i:=1 to k-1 do begin f:=true;

for x:=1 to 3 do for y:=1 to 3 do

if a[i,x,y]<>a[k,x,y] then begin f:=false;break;break;end; if f then exit; end;

nrep:=true; end;

procedure step(k:integer); var

i,x,y:integer; begin

if k>=20 then exit;

if result(k) then begin print(k);exit;end; look(k,x,y); for i:=1 to 4 do begin

if (x+rl[i,1]>=1)and(x+rl[i,1]<=3)and(y+rl[i,2]<=3)and(y+rl[i,2]>=1)then begin

a[k+1]:=a[k];

a[k+1,x+rl[i,1],y+rl[i,2]]:=a[k,x,y]; a[k+1,x,y]:=a[k,x+rl[i,1],y+rl[i,2]]; if nrep(k+1) then step(k+1); end; end; end;

begin a[1]:=st; step(1); end.

3、 跳马(5*5)

国际象棋8*8棋盘上某个位置的一只马,按马的行走规则,每个方格进入一次.,它是否可能只走63步,正好走过除起点外的其他63个位置各一次?如果有一种这样的走法,则称所走的这条路线为一条马的周游路线。试设计一个算法找出这样一条马的周游路线并输出。本题采用5*5的棋盘。

程序如下: const

d:array[1..8,1..2]of -2..2=((-2,1),(-2,-1),(1,2),(1,-2),(2,-1),(2,1),(-1,-2),(-1,2)); var

a:array[1..5,1..5]of 0..1; procedure print; var

i,j:integer; begin

for i:=1 to 5 do begin

for j:=1 to 5 do write(a[i,j]:3); writeln; end; readln; end;

procedure play(x,y:integer); var

i:integer; begin

if (x=5)and(y=5) then begin print;exit;end; for i:=1 to 8 do if

(x+d[i,1]>0)and(x+d[i,1]<6)and(y+d[i,2]>0)and(y+d[i,2]<6)and(a[x+d[i,1],y+d[i,2]]=0 )then begin

a[x+d[i,1],y+d[i,2]]:=1; play(x+d[i,1],y+d[i,2]); end; end; begin

fillchar(a,sizeof(a),0); a[1,1]:=1; play(1,1); end.

4、倒油

80、50、30三个容器,不带刻度,把80分成两个40. 初始(80,0,0)->目标(40,40.0) 程序如下: const

v:array[1..3]of integer=(80,50,30); var

a:array[1..30,1..3]of integer; procedure print(k:integer); var

i:integer; begin

for i:=1 to k do

writeln('step:',i,a[i,1]:3,a[i,2]:3,a[i,3]:3); readln; end;

function nrep(k:integer):boolean; var

i:integer; begin

nrep:=false;

for i:=1 to k-1 do

if (a[i,1]=a[k,1])and(a[i,2]=a[k,2])then exit; nrep:=true; end;

procedure step(k:integer); var

i,j:integer; begin

if (a[k,1]=40)and(a[k,2]=40) then begin print(k);exit;end; for i:=1 to 3 do for j:=1 to 3 do

if (i<>j)and(a[k,i]>0)and(a[k,j]

a[k+1]:=a[k];

if (a[k,i]+a[k,j]>v[j] )then begin a[k+1,i]:=a[k,i]+a[k,j]-v[j]; a[k+1,j]:=v[j];end else begin a[k+1,i]:=0;a[k+1,j]:=a[k,i]+a[k,j];end; if nrep(k+1) then step(k+1); end;

end; begin

a[1,1]:=80; a[1,2]:=0; a[1,3]:=0; step(1); end.

5、狼、羊、菜过河(农夫过河问题)

规则是:猎人每次只能带一样过河,而狼吃羊,羊吃菜,不能没有猎人在时在一起。算出过河的方案。

程序如下:

var

a:array[1..30,1..4]of integer; procedure print(k:integer); var

i:integer; begin

for i:=1 to k do

writeln('step:',i,a[i,1]:3,a[i,2]:3,a[i,3]:3,a[i,4]:3); readln; end;

function can(k:integer):boolean; var

i:integer; begin

can:=false;

if (a[k,2]=a[k,3])and(a[k,2]<>a[k,1])or(a[k,3]=a[k,4])and(a[k,3]<>a[k,1]) then exit; i:=k-2;

while i>0 do begin

if (a[i,1]=a[k,1])and(a[i,2]=a[k,2])and(a[i,3]=a[k,3])and(a[i,4]=a[k,4]) then exit; i:=i-2; end;

can:=true; end;

procedure step(k:integer); var

i:integer; begin

if a[k,1]+a[k,2]+a[k,3]+a[k,4]=0 then begin print(k);exit;end; for i:=1 to 4 do

begin

if i>1 then begin a[k+1]:=a[k];

a[k+1,i]:=1-a[k,i]; a[k+1,1]:=1-a[k,1]; end else begin

a[k+1]:=a[k];

a[k+1,1]:=1-a[k,1]; end;

if can(k+1) then step(k+1); end; end; begin

a[1,1]:=1; a[1,2]:=1; a[1,3]:=1; a[1,4]:=1; step(1); end.

6、野人和传教士过河

?野人和传教士各三人,小船只能载两人,要求野人的人数不能多于传教士。算出过河的方案总数。

程序如下:const

c:array[1..5,1..2]of 0..2=((1,0),(0,1),(2,0),(0,2),(1,1)); var

a:array[1..30,1..2]of integer; procedure print(k:integer); var

i,j:integer; begin

for i:=1 to k do begin

writeln('step:',i,a[i,1]:3,a[i,2]:3); end; end;

function can(k:integer):boolean; var

i:integer; begin

can:=false;

if (a[k,1]>3)or(a[k,1]<0)or(a[k,2]>3)or(a[k,2]<0) then exit;

if (a[k,1]>a[k,2])and(a[k,2]>0)or(a[k,1]


ACM经典算法(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:全市保障性安居工程实施情况专项督查方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: