p1536.pas

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· PAS 代码 · 共 118 行

PAS
118
字号
PROGRAM p1536;

CONST
        lp=10000;
        change  :array[1..4,1..2]of Integer=
        ((1,0),(0,1),(-1,0),(0,-1));

TYPE
        BigNum=array[0..100]of Longint;

VAR
        n,k                     :Integer;
        map                     :array[1..20,1..20]of Char;
        ans                     :array[0..1,1..20,1..20]of BigNum;

PROCEDURE Readin;
var
        i,j                     :Integer;
begin
readln(n,k);
for I:=1 to n do
        begin
        for J:=1 to n do read(map[i][j]);
        readln;
        end;
end;

PROCEDURE Add(var s,t:BigNum);
var
        i,temp                  :Longint;
begin
for i:=s[0]+1 to t[0] do s[i]:=0;
for I:=1 to t[0] do s[i]:=s[i] + t[i];
if t[0]>s[0] then s[0]:=t[0];
temp:=0;
for I:=1 to s[0] do
        begin
        temp:=temp + s[i];
        s[i]:=temp mod lp;
        temp:=temp div lp;
        end;
while (temp>0) do
        begin
        inc(s[0]);
        s[s[0]]:=temp mod lp;
        temp:=temp div lp;
        end;
end;

PROCEDURE print(var t:BigNum);
var
        i,j                     :Integer;
begin
write(t[t[0]]);
for i:=t[0]-1 downto 1 do
        begin
        for J:=1 to 4-(trunc(ln(t[i])/ln(10))+1) do write('0');
        write(t[i]);
        end;
writeln;
end;

PROCEDURE main;
var
        d,i,j,w                 :Integer;
        a,b,p,q                 :Integer;
begin
if (k<n + n -2) or odd(k) or (map[1][1]='1') or (map[n][n]='1') then
        begin
        writeln(0);
        exit;
        end;

a:=0;
b:=1;
fillchar(ans,sizeof(ans),0);

ans[a][1][1][1]:=1;
ans[a][1][1][0]:=1;
        // edge information

for d:=1 to k do
        begin
        for i:=1 to n do
                for J:=1 to n do
                        if map[i][j]='1' then
                                begin
                                ans[b][i][j][0]:=1;
                                ans[b][i][j][1]:=0;
                                end else
                                begin
                                ans[b][i][j][0]:=0;
                                ans[b][i][j][1]:=0;
                                for w:=1 to 4 do
                                        begin
                                        p:=i + change[w][1];
                                        q:=j + change[w][2];

                                        if (p<1)or(p>n)or(q<1)or(q>n) then continue;
                                        Add(ans[b][i][j],ans[a][p][q]);
                                        end;
                                end;
        a:=1-a;
        b:=1-b;
        end;

print(ans[a][n][n]);
end;

BEGIN
//assign(input,'p.in');
//reset(input);
while not eof do
        begin
        Readin;
        Main;
        end;
END.

⌨️ 快捷键说明

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