過河卒(NOIp2002)
【問題描述】
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用坐標表示,A點(0, 0)、B點(n, m),(n, m為不超過20的整數),同樣馬的位置坐標是需要給出的。C≠A且C≠B。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
基本介紹
- 中文名:過河卒
- 外文名:soldier
- 經典題目:過河卒(跳馬)
算法分析
樣例程式
const dx:array[1..8] of integer=(-2, -1, 1, 2, 2, 1, -1, -2); dy:array[1..8] of integer=(1, 2, 2, 1, -1, -2, -2, -1);var n,m,x,y,i,j:integer; g:array[0..20, 0..20] of boolean; f:array[0..20, 0..20] of int64;begin readln(n,m,x,y); g[x,y]:=true; for i:=1 to 8 do if(x+dx[i]>=0)and(x+dx[i]<=n)and(y+dy[i]>=0)and(y+dy[i]<=m)then g[x+dx[i],y+dy[i]]:=true; f[0,0]:=1; for i:=1 to n do if not(g[i,0]) then f[i,0]:=f[i-1,0]; for i:=1 to m do if not(g[0,i]) then f[0,i]:=f[0,i-1]; for i:=1 to n do for j:=1 to m do if not(g[i,j]) then f[i,j]:=f[i-1,j]+f[i,j-1]; writeln(f[n,m]);end.