馬攔過河卒 (sdut oj)


馬攔過河卒

Time Limit: 3000MS Memory Limit: 65536KB


Problem Description

棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。因此稱之爲“馬攔過河卒”。棋盤用座標表示,A點(0,0)、B點(n,m)(n,m爲不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。


Input

一行四個數據,用空格分隔,分別表示B點的座標和馬的座標。


Output

一個數據,表示所有的路徑條數。


Example Input

6 6 3 3


Example Output

6

Hint

Author





參考代碼



#include<stdio.h>
int main()
{

    int bx,by,mx,my;
    int i,j;
    long long int a[16][16];
    int g[16][16];
    int dx[9] = {0,-2,-1,1,2,2,1,-1,-2};
    int dy[9] = {0,1,2,2,1,-1,-2,-2,-1};
    scanf("%d%d%d%d",&bx,&by,&mx,&my);
    g[my][mx] = 1;
    for( i = 1; i <= 8; i++ )
    {
        if( ( mx + dx[i] >= 0 ) && ( my + dy[i] >= 0 ) && ( mx + dx[i] <= bx ) && ( my + dy[i] <= by ) )
            g[my+dy[i]][mx+dx[i]] = 1;
    }
    for( i = 0; i <= by; i++ )
    {
        for( j = 0; j <= bx; j++ )
        {
            if( j == 0 && i == 0 )
                a[i][j] = 1;
            else if( g[i][j] == 1 )
                a[i][j] = 0;
            else
            {
                if( i == 0 )
                    a[i][j] = a[i][j-1];
                else if( j == 0 )
                    a[i][j] = a[i-1][j];
                else
                    a[i][j] = a[i-1][j]+a[i][j-1];

            }
        }
    }
    printf("%lld\n",a[by][bx]);
    return 0;
}


發佈了189 篇原創文章 · 獲贊 60 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章