1. 程式人生 > 其它 >一本通1314:過河卒(Noip2002)

一本通1314:過河卒(Noip2002)

1314:【例3.6】過河卒(Noip2002)


時間限制: 1000 ms         記憶體限制: 65536 KB
提交數: 22768     通過數: 9776

【題目描述】

棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上的某一點有一個對方的馬(如C點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點,如圖3-1中的C點和P1,……,P8,卒不能通過對方馬的控制點。棋盤用座標表示,A點(0,0)、B點(n, m) (n,m為不超過20的整數),同樣馬的位置座標是需要給出的,C≠A且C≠B。現在要求你計算出卒從A點能夠到達B點的路徑的條數。

【輸入】

給出n、m和C點的座標。

【輸出】

從A點能夠到達B點的路徑的條數。

【輸入樣例】

8 6 0 4

【輸出樣例】

1617
程式碼如下:
#include<iostream>
#include<stdio.h>
using namespace std;
long long f[21][21]={0},g[21][21]={0};
int main()
{
    int n,m,cx,cy,i,j;
    scanf("%d %d %d %d",&n,&m,&cx,&cy);
    f[0][0]=1;//初始化出發點 
    g[cx][cy]=1
;//標註C點 //判斷C可走的點是否越界 並標註 if(cx-2>=0&&cy-1>=0)g[cx-2][cy-1]=1; if(cx-1>=0&&cy-2>=0)g[cx-1][cy-2]=1; if(cx+1<=n&&cy-2>=0)g[cx+1][cy-2]=1; if(cx+2<=n&&cy-1>=0)g[cx+2][cy-1]=1; if(cx+2<=n&&cy+1<=m)g[cx+2][cy+1]=1;
if(cx+1<=n&&cy+2<=m)g[cx+1][cy+2]=1; if(cx-1>=0&&cy+2<=m)g[cx-1][cy+2]=1; if(cx-2>=0&&cy+1<=m)g[cx-2][cy+1]=1; //初始化邊界 for(i=1;i<=n;i++) if(g[i][0]==0) f[i][0]=f[i-1][0]; for(i=1;i<=m;i++) if(g[0][i]==0) f[0][i]=f[0][i-1]; //逐層遞推 for(i=1;i<=n;i++) for(j=1;j<=m;j++){ if(g[i][j]==1)f[i][j]=0; if(g[i][j]==0)f[i][j]=f[i-1][j]+f[i][j-1]; } printf("%lld",f[n][m]); return 0; }