p1293 馬攔過河卒
阿新 • • 發佈:2018-12-09
題目
描述 Description
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔過河卒”。
棋盤用座標表示,A點(0, 0)、B點(n, m)(n, m為不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
輸入格式 Input Format
一行四個資料,分別表示B點座標和馬的座標。
輸出格式 Output Format
一個數據,表示所有的路徑條數。
樣例輸入 Sample Input
6 6 3 3
樣例輸出 Sample Output
6
時間限制 Time Limitation
每個測試點1s
來源 Source
zhouyc
程式碼
#include<bits/stdc++.h>
using namespace std;
const int _=100;
typedef long long ll;
inline ll read()
{
ll f=1,num=0;
char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0', ch=getchar();
return num*f;
}
ll f[_][_],horse[_][_];
void H(ll x,ll y)
{
horse[x][y]=1;
horse[x-1][y-2]=horse[x-2][y-1]=horse[x-2][y+1]=horse[x-1][y+2]=1;
horse[x+1][y-2]=horse[x+2][y-1]=horse[x+2][y+1]=horse[x+1][y+2]=1;
}
int main()
{
ll n=read(),m=read();
ll x=read(),y=read();
H(x,y);
f[1][0]=1;
for (int i=1;i<=n+1;++i)
for (int j=1;j<=m+1;++j)
{
f[i][j]=f[i-1][j]+f[i][j-1];
if (horse[i-1][j-1]) f[i][j]=0;
}
printf("%lld\n",f[n+1][m+1]);
return 0;
}