1. 程式人生 > >p1293 馬攔過河卒

p1293 馬攔過河卒

題目

描述 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; }