luogu1002 過河卒(NOIP2002普及組第4題)
阿新 • • 發佈:2019-01-26
時空限制 1000ms/128MB
題目描述
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m為不超過20的整數),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入輸出格式
輸入格式:一行四個資料,分別表示B點座標和馬的座標。
輸出格式:一個數據,表示所有的路徑條數。
輸入輸出樣例
輸入樣例#1:6 6 3 3輸出樣例#1:
6
程式碼
#include<iostream> #include<algorithm> using namespace std; const int N = 25; long long f[N][N]; bool g[N][N]; int dx[]={0,2,1,-1,-2,-2,-1, 1, 2}, dy[]={0,1,2, 2, 1,-1,-2,-2,-1}; int main(){ int n,m,x,y; cin>>n>>m>>x>>y; fill(g[0],g[0]+N*N,true); for (int i=0; i<=8; i++){ int xx=x+dx[i],yy=y+dy[i]; if (xx>=0 && xx<=n && yy>=0 && yy<=m) g[xx][yy]=false; } fill(f[0],f[0]+N*N,0); f[0][0]=1LL; for (int i=1; i<=n; i++) if (g[i][0]) f[i][0]=f[i-1][0]; for (int i=1; i<=m; i++) if (g[0][i]) f[0][i]=f[0][i-1]; for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) if (g[i][j]) f[i][j]=f[i-1][j]+f[i][j-1]; cout<<f[n][m]<<endl; return 0; }