betsy.pas

来自「Magio牛的usaco源代码」· PAS 代码 · 共 82 行

PAS
82
字号
{
ID:maigoak1
PROG:betsy
}

program betsy;
const
  maxn=7;
  dx:array[1..4]of shortint=(-1,1,0,0);
  dy:array[1..4]of shortint=(0,0,-1,1);
var
  fin,fout:text;
  v:array[0..maxn+1,0..maxn+1]of boolean;
  adj:array[0..maxn+1,0..maxn+1]of byte;
  n,maxlv,i,j:byte;
  count:longint;
procedure search(x,y,lv,dir:byte);
  var
    d,l,r,bx,by,lx,ly,rx,ry,fx,fy,flx,fly,frx,fry:byte;
  begin
    if v[x,y] then exit;
    if (x=n) and (y=1) then exit;
    if lv=maxlv then begin inc(count);exit;end;

    if dir>2 then begin l:=1;r:=2;end else begin l:=3;r:=4;end;
    fx:=x+dx[dir];fy:=y+dy[dir];
    lx:=x+dx[l];ly:=y+dy[l];rx:=x+dx[r];ry:=y+dy[r];
    if v[fx,fy] and (not v[lx,ly]) and (not v[rx,ry]) then exit;
    flx:=fx+dx[l];fly:=fy+dy[l];
    if v[flx,fly] and (not v[fx,fy]) and (not v[lx,ly]) then exit;
    frx:=fx+dx[r];fry:=fy+dy[r];
    if v[frx,fry] and (not v[fx,fy]) and (not v[rx,ry]) then exit;

    v[x,y]:=true;
    bx:=x-dx[dir];by:=y-dy[dir];
    for d:=1 to 4 do
      if not ((bx+dx[d]=n) and (by+dy[d]=1)) and (not v[bx+dx[d],by+dy[d]]) then
        if adj[bx+dx[d],by+dy[d]]=2 then begin v[x,y]:=false;exit;end;
    for d:=1 to 4 do
      dec(adj[bx+dx[d],by+dy[d]]);

    for d:=1 to 4 do
      search(x+dx[d],y+dy[d],lv+1,d);

    v[x,y]:=false;
    for d:=1 to 4 do
      inc(adj[bx+dx[d],by+dy[d]]);
  end;
begin
  assign(fin,'betsy.in');
  reset(fin);
  readln(fin,n);
  close(fin);
  maxlv:=n*n-1;

  for i:=1 to n do begin
    v[0,i]:=true;v[n+1,i]:=true;
    v[i,0]:=true;v[i,n+1]:=true;
    adj[0,i]:=1;adj[n+1,i]:=1;
    adj[i,0]:=1;adj[i,n+1]:=1;
  end;
  for i:=1 to n do
    for j:=1 to n do begin
      v[i,j]:=false;
      adj[i,j]:=4-ord((i=1) or (i=n))-ord((j=1) or (j=n));
    end;

  if n=1 then
    count:=1
  else begin
    count:=0;
    v[1,1]:=true;
    search(1,2,2,4);
    search(2,1,2,2);
  end;

  assign(fout,'betsy.out');
  rewrite(fout);
  writeln(fout,count);
  close(fout);
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?