永发信息网

(pascal)高分求完全背包、广搜、深搜的标程

答案:1  悬赏:30  手机版
解决时间 2021-04-15 20:06

RT,好的回答追加

(PS:广搜和深搜麻烦用过程(procedure)写,谢了)

最佳答案

完全背包:


program knapsack04;
const maxm=2000;maxn=30;
type ar=array[0..maxn] of integer;
var m,n,j,i,t:integer;
c,w:ar;
f:array[0..maxm] of integer;
begin
readln(m,n);
for i:= 1 to n do
readln(w[i],c[i]);
f(0):=0;
for i:=1 to m do
for j:=1 to n do
begin
if i>=w[j] then t:=f[i-w[j]]+c[j];
if t>f[i] then f[i]:=t
end;
writeln(f[m]);
end.






搜索





输入文件:knight.in
输出文件:knight.out
问题描述:
在一个标准8*8的图际象棋棋盘上,棋盘中有些格子可能是有障碍物的。已知骑士的初始位置和目标位置,你的任务是计算出骑士最少需要多少步可以从初始位置到达目标位置。有障碍物的格子当然不可以到达。
标准的8*8的国际象棋棋盘中每一个格子可以用唯一的编号确定。行用1-8这8个数字依次表示,列用’a’—‘h’这8个字母依次表示。例如左下图的骑士所在位置(图中有n的格子)的编号为“d4”(注意’d’和’4’之间没有空格)。









我们知道国际象棋中的骑士可以按“L”路线移动(一个方向走2个格子,接着垂直方向走1个格子)。因此,如左上图中的骑士(位于d4),可以到达位置c2、b3、b5、c6、e6、f5、f3和e2(图中有’x’)标记的格子)。此外,骑士不能移出棋盘。
骑士可以按照移动规则自由地在棋盘上没有障碍物的格子中移动,右上图给出了一个骑士移动的例子。初始格子用’n’标记,目标格子用’N’标记,有障碍物的格子用’b’标记。一个可行的移动序列在图中用数字标记出来。(a1,b3,a5,c6,e5,g4,h2,f1)。总共需要7步才能完成。事实上,这也就是最小的步数了。
输入格式:
输入文件包括1个或多个测试数据。
每一个测试数据的第一行是一个整数b(-1<=b<=62),表示棋盘中有障碍物的格子数目,当b=-1时,输入文件结束。
第二行含b个不同的有障碍物的格子编号,用空格隔开。当b=0时,此行为空行。
第三行是骑士的初始格子和目标格子的编号,也是用空格隔开。初始格子和目标格子是不同的,且都没有障碍物。
输出格式:
对于每个数据,输出一行。格式:Board n: m moves
其中n表示数据的序号(从1开始)m表示骑士所用的最小的步数。
如果骑士无法到达目标格子,输出:Board n: not reachable
输入样例:
10
c1 d1 d5 c2 c3 c4 d2 d3 d4 c5
a1 f1
0

c1 b3
2
b3 c2
a1 b2
-1
输出样例:
Board 1:7 moves
Board 2:1 moves
Board 3:not reachable
宽搜(骑士问题)
const f:array[1..8,1..2]of integer=((-2,-1),(-1,-2),(1,-2),(2,-1),(2,1),(1,2),(-1,2),(-2,1));
type zb=record
i:integer;
j:integer;
bu:integer;
end;
var b,i,j,k,answer:integer;
pan:array[-1..10,-1..10]of boolean;
start,finish:zb;
qi:array[1..100000]of zb;
can:boolean;

procedure zhuan(s:string;var i,j:integer);
begin
i:=ord(s[2])-ord('0');
j:=ord(s[1])-ord('a')+1;
end;

procedure init;
var s,sub:string;
i,j:integer;
begin
readln(s);
if s<>'' then
repeat
sub:=copy(s,1,2);
zhuan(sub,i,j);
pan[i,j]:=false;
delete(s,1,3);
until s='';
readln(s);
sub:=copy(s,1,2);
zhuan(sub,start.i,start.j);
sub:=copy(s,4,2);
zhuan(sub,finish.i,finish.j);
end;

function ok(i,j:integer):boolean;
begin
if (i>0) and (i<9) and (j>0) and (j<9) and pan[i,j] then ok:=true else ok:=false;
end;

procedure work;
var p,q,i:integer;
qs,kz:zb;
pd:boolean;
begin
p:=0;
q:=1;
qi[1].i:=start.i;
qi[1].j:=start.j;
qi[1].bu:=0;
can:=true;
pd:=false;
repeat
inc(p);
qs:=qi[p];
for i:=1 to 8 do
begin
kz.i:=qs.i+f[i,1];
kz.j:=qs.j+f[i,2];
if ok(kz.i,kz.j) then
begin
pan[kz.i,kz.j]:=false;
inc(q);
qi[q].i:=kz.i;
qi[q].j:=kz.j;
qi[q].bu:=qi[p].bu+1;
if (kz.i=finish.i) and (kz.j=finish.j) then
begin
pd:=true;
answer:=qi[q].bu;
end;
end;
end;
until (p=q) or (pd);
if p=q then can:=false;
end;

procedure print;
begin
if can then writeln(answer,' moves') else writeln('not reachable');
end;

begin
assign(input,'knight.in'); reset(input);
assign(output,'knight.out'); rewrite(output);
k:=0;
repeat
readln(b);
inc(k);
if b<>-1 then
begin
write('Board ',k,': ');
for i:=1 to 8 do
for j:=1 to 8 do pan[i,j]:=true;
init;
work;
print;
end;
until b=-1;
close(input);
close(output);
end.

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样的女人值得爱
梦见姐姐找我初恋男友问为何不能与我在一起
中学生去健身房一星期几次才合适??
耳麦有回音怎么回事
魔法卡片怎么获得魔力,魔兽世界7.0远古魔力怎
提问~~~有没有可以改变背景和字体颜色的看txt
梦幻买来的号要改什么
请电脑高手帮我解决下怎么显示不正常啊网页
是红钻的就请进来
CAD2008打印图纸,设置了居中,怎么会不居中
excel2003高级筛选
际会乡财政所在什么地方啊,我要过去处理事情
来了月经带感冒为什么老想去厕所,喝一杯水去
进入QQ空间中的“QQ农场”,无法打开自己已购
初中七年级期末评语,某校七年级2班要举行“闻
推荐资讯
IBM R52笔记本电脑屏线怎么样修 ?
S262/S263(路口)地址有知道的么?有点事想过
读书怎么会那么累呢
已知a、b、c都是正整数,且满足a*a+c*c=10,c*
你好、可以帮我解释这段英语什么意思吗?
谁有二手吊车 和叉车出售? 要能用
AVA什么时候开始的?什么是不删档内测号?什
问:有买过保温裤的吗,第五街的保温裤为什么
西雅图咖啡馆这个地址在什么地方,我要处理点
而那过去了的后一句,形容感情走向美好的句子
植萃集舒爽祛痘调理水用完后会有刺刺的感觉是
穿越火线真的要封服吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?