新手光能
先把把1051迷宫问题(迷宫问题是学习搜索最基本的题,不会就别做迷宫寻宝了)里面的步数(sum)一开始赋值999
99,再把search(int c,int r)换成search(int c,int r,int t),在调用的时候search(起始点行,起始点列
,0),把地图录入a[][]二维数组。
接下来把search函数里判断当前已经走到宝藏点的时候本来是sum++现在改成判断t是不是小于sum,如果小于,则记
录。
if(c==宝藏点行&&r==宝藏点列) { if(t<sum) sum=t; return ; }
然后else里的for循环里的继续搜索search(下一步行,下一步列)换成search(下一步行,下一步列,t+1)。
这样就完成了。
新手守护
var
i,nx,ny:longint;
begin
if (x=zx) and (y=zy) then
begin
if k<min then min:=k;
exit;
end;
for i:=1 to 4 do
begin
nx:=x+l[i,1];
ny:=y+l[i,2];
if (nx>=1) and (nx<=9) and (ny>=1) and (ny<=9) and (a[nx,ny]=0) and (b[nx,ny]=false) then
begin
b[nx,ny]:=true;
inc(k);
cmp(nx,ny);
dec(k);
b[nx,ny]:=false;
end;
end;
end;
初级守护
1051迷宫问题会写吧? (这个不会写那迷宫寻宝就别想了。。。)
搜索回溯过程主体:
procedure cmp(x,y:longint);
var
i,nx,ny:longint;
begin
if (x=zx) and (y=zy) then
begin
if k<min then min:=k; //min初值定义成maxlongint;min是记录最少步数的
exit;
end;
for i:=1 to 4 do //遍历4个方向
begin
nx:=x+l[i,1];
ny:=y+l[i,2];
if (nx>=1) and (nx<=9) and (ny>=1) and (ny<=9) and (a[nx,ny]=0) and (b[nx,ny]=false) then
begin
b[nx,ny]:=true;
inc(k); //k是记录步数的
cmp(nx,ny);
dec(k); //回溯时k要减1
b[nx,ny]:=false;
end;
end;
end;
初级守护
1051迷宫问题会写吧? (这个不会写那迷宫寻宝就别想了。。。)
搜索回溯过程主体:
procedure cmp(x,y:longint);
var
i,nx,ny:longint;
begin
if (x=zx) and (y=zy) then
begin
if k<min then min:=k; //min初值定义成maxlongint;min是记录最少步数的
exit;
end;
for i:=1 to 4 do //遍历4个方向
begin
nx:=x+l[i,1];
ny:=y+l[i,2];
if (nx>=1) and (nx<=9) and (ny>=1) and (ny<=9) and (a[nx,ny]=0) and (b[nx,ny]=false) then
begin
b[nx,ny]:=true;
inc(k); //k是记录步数的
cmp(nx,ny);
dec(k); //回溯时k要减1
b[nx,ny]:=false;
end;
end;
end;
修练者
先把把1051迷宫问题(迷宫问题是学习搜索最基本的题,不会就别做迷宫寻宝了)里面的步数(sum)一开始赋值999
99,再把search(int c,int r)换成search(int c,int r,int t),在调用的时候search(起始点行,起始点列
,0),把地图录入a[][]二维数组。
接下来把search函数里判断当前已经走到宝藏点的时候本来是sum++现在改成判断t是不是小于sum,如果小于,则记
录。
if(c==宝藏点行&&r==宝藏点列)
{
if(t<sum) sum=t;
return ;
}
然后else里的for循环里的继续搜索search(下一步行,下一步列)换成search(下一步行,下一步列,t+1)。
这样就完成了。