搜集糖果(candy)
【题目描述】
在一片N*M的四连通(一个点与它上方、下方、左方、右方这四个点连通)田野中,散布着很多很多的糖果。Ryz现在要以(x,y)为起点去搜集糖果。Ryz搜集当前点的糖果并走到下一格需要一个单位时间。由于田野中还有许多其它的喜欢吃糖果的小动物,所以每过一个单位时间,所有格子上的糖果都会减少一半。Ryz不喜欢做徒劳的工作,所有同一个格子不能走两遍。如果当前点周围所有连通的格子都已经被走过了,那么这次搜集就结束了。现在请你帮助他收集尽量多的糖果,输出你的移动序列,用”U”代表向上,”D”代表向下,”R”代表向右,”L”代表向左。
【输入格式】
第一行两个正整数N,M,x,y,表示地图大小和初始位置。
接下来的N行M列描述了每个格子的初始糖果s[i][j]。
【输出格式】
一行若干个字符,表示你的移动序列。
【输入样例1】
2 2 1 1
1 16
8 4
【输出样例1】
RDL
【输入样例2】
3 3 1 1
6 9 4
7 1 3
8 2 5
【输出样例2】
RRDDLLUR
【数据范围与约定】
对于100%的数据,n<=100,m<=100,0<=s[i][j]<=100000
对于100%的数据,s[i][j]互不相等。
下表列出了各个数据点n,m的范围。
数据编号 | n,m | 数据编号 | n,m |
1 | <=5 | 6 | <=60 |
2 | <=5 | 7 | <=60 |
3 | <=20 | 8 | <=80 |
4 | <=20 | 9 | <=80 |
5 | <=40 | 10 | <=100 |
题解:这是一道很玄学的搜索题,主要思想就是:我们先向前走N步(N要适当,大了会超时,小了会WA),然后选择最优的一条路走,直至走完。能否AC各凭天运吧。
Code:
{$M 20000000,0,maxlongint}
var
n,m,x,y,i,j,ans:longint;
t:array[0..18]of int64;
dx,dy:array[1..4]of longint;
dd:array[1..4]of char;
s:array[0..101,0..101]of longint;
flag:array[0..101,0..101]of boolean;
procedure dfs1(x,y,z:longint;num:int64);
var i,nx,ny:longint;
begin
if num>ans then ans:=num;
if z>=13 then exit;
for i:=1 to 4 do
begin
nx:=x+dx[i];
ny:=y+dy[i];
if (nx<1)or(ny<1)or(nx>n)or(ny>m)or flag[nx,ny] then continue;
flag[nx,ny]:=true;
dfs1(nx,ny,z+1,num+t[13-z-1]*s[nx,ny]);
flag[nx,ny]:=false;
end;
end;
procedure dfs2(x,y:longint);
var i,nx,ny,sx,sy,si,max:longint;
begin
max:=-1<<29;
for i:=1 to 4 do
begin
nx:=x+dx[i];ny:=y+dy[i];
if (nx<1)or(ny<1)or(nx>n)or(ny>m)or flag[nx,ny] then continue;
flag[nx,ny]:=true;
ans:=0;
dfs1(nx,ny,0,t[13]*s[nx,ny]);
flag[nx,ny]:=false;
if ans>max then
begin
max:=ans;sx:=nx;sy:=ny;si:=i;
end;
end;
if max=-1<<29 then exit;
write(dd[si]);
flag[sx,sy]:=true;
dfs2(sx,sy);
end;
begin
assign(input,'candy.in');reset(input);
assign(output,'candy.out');rewrite(output);
dx[1]:=-1;dy[1]:=0;dd[1]:='U';
dx[2]:=0;dy[2]:=-1;dd[2]:='L';
dx[3]:=0;dy[3]:=1;dd[3]:='R';
dx[4]:=1;dy[4]:=0;dd[4]:='D';
readln(n,m,x,y);
t[0]:=1;
for i:=1 to 17 do t[i]:=t[i-1]*2;
for i:=1 to n do
for j:=1 to m do read(s[i,j]);
flag[x,y]:=true;
dfs2(x,y);writeln;
close(input);close(output);
end.
标签:nx,..,搜集,ny,flag,dx,dy,糖果 From: https://blog.51cto.com/u_15888102/5878376