SDUT-1265 馬攔過河卒

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章