P1560 蜗牛的旅行

这题是找最多走过了格数,可以用dfs

const z:array[1..4,1..2]of -1..1=((0,1),(0,-1),(1,0),(-1,0));//呀,方便啊
var i,j,k,x,y:longint;
    m,n,max:longint;
    a:array[0..200,0..200]of 0..2;//记录所用的表格
    s:string;
procedure dfs(x,y,fx,sum:longint);//DFS-QAQ
var i,j:longint;
begin
  if a[x,y]=1 then
  begin
  if sum>max then max:=sum;
  if a[x+z[fx,1],y+z[fx,2]]=1 then//如果可以的话一直向前走QAQ
  begin
    a[x,y]:=2;
    dfs(x+z[fx,1],y+z[fx,2],fx,sum+1);//dfs
    a[x,y]:=1;
  end
  else
  begin
  a[x,y]:=2;
    if a[x+z[fx,1],y+z[fx,2]]=0 then
    begin
      if fx in [1..2] then//根据方向查找,不可以走相反方向和相同方向
      begin
      if a[x+z[4,1],y+z[4,2]]=1 then
      dfs(x+z[4,1],y+z[4,2],4,sum+1);//dfs
      if a[x+z[3,1],y+z[3,2]]=1 then
      dfs(x+z[3,1],y+z[3,2],3,sum+1);//dfs
      end
      else
      begin
      if a[x+z[1,1],y+z[1,2]]=1 then
      dfs(x+z[1,1],y+z[1,2],1,sum+1);//dfs
      if a[x+z[2,1],y+z[2,2]]=1 then
      dfs(x+z[2,1],y+z[2,2],2,sum+1);//dfs__QAQ
      end;
    end;
  a[x,y]:=1;//已经走过了
  end;
  end;
end;
begin
  read(n,m);
  for i:=1 to n do
  for j:=1 to n do
  a[i,j]:=1;
  readln;
  for i:=1 to m do
  begin
    readln(s);//读入麻烦一点
    x:=ord(s[1])-ord('A')+1;
    y:=ord(s[2])-ord('0');
    if length(s)>=3 then
    y:=y*10+ord(s[3])-ord('0');
    if length(s)>=4 then
    y:=y*10+ord(s[4])-ord('0');
    a[y,x]:=0;
  end;
  for i:=1 to 4 do//四个方向查找
  begin
    dfs(1,1,i,1);
  end;
  write(max);//输出最大的解就可以了QAQ
end.

平时BFS写多了,来一道DFS也不错

猜你喜欢

转载自blog.csdn.net/sxy__orz/article/details/86562220