Problem Description
棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱爲對方馬的控制點。因此稱之爲“馬攔過河卒”。棋盤用座標表示,A點(0,0)、B點(n,m)(n,m爲不超過15的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從A點能夠到達B點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
Input
一行四個數據,用空格分隔,分別表示B點的座標和馬的座標。
Output
一個數據,表示所有的路徑條數。
Sample Input
6 6 3 3
Sample Output
6
解析:算是一個遞推題,稍微提升了一點難度,總體來說還是a[i][j]=a[i-1][j]+a[i][j-1] 的問題,不過也有幾個地方需要注意,測試數據爲(0,0,0,0)時,這時就有點bug,接下來需要改進。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
long long a[20][20];
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
memset(a,0,sizeof(a));
int temx[]={-2,-1,1,2,2,1,-2,-1};
int temy[]={1,2,2,1,-1,-2,-1,-2};
for(int i=0;i<8;i++){
a[x2+temx[i]][y2+temy[i]]=-1;//馬可以移動的位置
// int tx=x2+temx[i],ty=y2+temy[i];
// cout<<"("<<tx<<","<<ty<<") -1\n"<<endl;
}
if(x2<=x1&&y2<=y1) a[x2][y2]=-1; //馬所在的位置
for(int i=0;i<=x1;i++){
for(int j=0;j<=y1;j++){
if(i==0&&j==0){
a[i][j]=1;
continue;
}
else if(a[i][j]==-1){
// cout<<"("<<i<<","<<j<<") "<<a[i][j]<<endl;
continue;
}
else{
if((i-1)>=0&&a[i-1][j]!=-1){
a[i][j]+=a[i-1][j];
}
if((j-1)>=0&&a[i][j-1]!=-1){
a[i][j]+=a[i][j-1];
}
}
// cout<<"("<<i<<","<<j<<") "<<a[i][j]<<endl;
}
}
if(a[x1][y1]==-1) cout<<"0"<<endl;
else cout<<a[x1][y1]<<endl;
return 0;
}