社区讨论

递归不知道哪里写错了。求大神扫两眼。

P1004[NOIP 2000 提高组] 方格取数参与者 5已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi4eqqr5
此快照首次捕获于
2025/11/18 18:05
4 个月前
此快照最后确认于
2025/11/18 18:05
4 个月前
查看原帖
CPP
type pp=record
        num:integer;
        flag:boolean;
        end;
var n,a,b,c,i:integer;
    pos:array[1..9,1..9]of pp;
function max(a1,a2,a3,a4:integer):integer;
begin
  if (a1>=a2)and(a1>=a3)and(a1>=a4) then max:=a1;
  if (a2>=a1)and(a2>=a3)and(a2>=a4) then max:=a2;
  if (a3>=a2)and(a3>=a1)and(a3>=a4) then max:=a3;
  if (a4>=a2)and(a4>=a3)and(a4>=a1) then max:=a4;
end;
function value(x:pp):integer;
begin
 if not x.flag then value:=x.num
 else value:=0;
end;
function f(k,i1,i2:integer):integer;//f为走了k步,第一第二枚棋子横坐标为i1 i2时的最大数
var j1,j2:integer;
begin
 j1:=k-i1;
 j2:=k-i2;
 pos[i1,j1].flag:=true;
 pos[i2,j2].flag:=true;
 if i1=i2 then
  if i1=1 then f:=0
   else if j1=1 then f:=f(k-1,i1-1,i2-1)+value(pos[i1-1,j1])
        else f:=max(f(k-1,i1-1,i2)+value(pos[i1-1,j1]),f(k-1,i1,i2-1)+value(pos[i1,j1-1]),0,0)
  else f:=max(f(k-1,i1-1,i2-1)+value(pos[i1-1,j1])+value(pos[i2-1,j2]),f(k-1,i1-1,i2)+value(pos[i1-1,j1])+value(pos[i2,j2-1]),f(k-1,i1,i2-1)+value(pos[i1,j1-1])+value(pos[i2-1,j2]),f(k-1,i1,i2)+value(pos[i1,j1-1])+value(pos[i2,j2-1]));
 pos[i1,j1].flag:=false;
 pos[i2,j2].flag:=false;
end;
begin
 readln(n);
 c:=1;
 while c<>0 do
  begin
   readln(a,b,c);
   if c=0 then break;
   pos[a,b].num:=c;
  end;
  write(f(2*n-2,n,n));
end.

回复

4 条回复,欢迎继续交流。

正在加载回复...