馬攔過河卒

貴有恆,何必三更起五更眠;最無益,莫過一日曝十日寒。

問題 I: 【回溯法】馬攔過河卒

馬攔過河卒

時間限制: 1 Sec  內存限制: 128 MB 提交: 35  解決: 11 [提交][狀態][討論版]

題目描述

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

輸入

一行四個數據,分別表示B點座標和馬的座標。(保證所有的數據有解)

輸出

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

樣例輸入

6 6 3 3

樣例輸出

6
用的動態規劃做的。
居然把n和m輸入反過來了。。。。找了半天錯誤愣是沒看到
#include <iostream>
#include <cstring>

using namespace std;
long long f[25][25];
int a[25][25],m,n,x,y;
int zx[8]={-2,-1,1,2,2,1,-1,-2},zy[8]={-1,-2,-2,-1,1,2,2,1};
int main()
{
    cin>>n>>m>>x>>y;
    memset(f,0,sizeof(f));
    memset(a,0,sizeof(a));
    a[x+1][y+1]=1;
    for(int i=0;i<8;i++)
    {
        if(x+zx[i]>=0&&y+zy[i]>=0)
            a[x+zx[i]+1][y+zy[i]+1]=1;
    }

    f[1][1]=1;
    for(int i=1;i<=n+1;i++)
    {
        for(int j=1;j<=m+1;j++)
        {
            if(i==1&&j==1)  continue;
            if(a[i][j]==1)  continue;
            f[i][j]=f[i-1][j]+f[i][j-1];
        }
    }
    cout<<f[n+1][m+1]<<endl;
    return 0;
}
View Code

 

posted on 2016-08-06 16:51 asuml 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章