1. 程式人生 > >遞推遞迴練習--L(馬攔過河卒)

遞推遞迴練習--L(馬攔過河卒)

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

Input:一行四個資料,用空格分隔,分別表示B點的座標和馬的座標。

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

解題思路:

1、讀題可知,題目是一個棋盤,所以很容易的考慮到用二維陣列。

2、遞推遞迴問題,即首先確定一個二維陣列,令其值均為1,馬能到達的位置的值設為-1,然後開始迴圈。

3、迴圈如下:如果走到馬能到達的位置,則continue;如果i-1>=0並且a[i-1][j]>=0,a[i][j]=a[i][j]+a[i-1][j];即該二維陣列存的值為到達某一點的路徑數。

原始碼:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x1,y1,x2,y2;
    while (cin>>x1>>y1>>x2>>y2)
    {
        int i,j;
        int a[16][16]={1};
        a[
x2][y2]=-1; a[x2-2][y2+1]=-1; a[x2-1][y2+2]=-1; a[x2-2][y2-1]=-1; a[x2-1][y2-2]=-1; a[x2+1][y2+2]=-1; a[x2+1][y2-2]=-1; a[x2+2][y2+1]=-1; a[x2+2][y2-1]=-1; a[0][0]=1; for (i=0;i<=x1;i++) { for (j=0;j<=
y1;j++) { if (a[i][j]==-1) continue; if (i-1>=0&&a[i-1][j]>=0) a[i][j]=a[i][j]+a[i-1][j]; if (j-1>=0&&a[i][j-1]>=0) a[i][j]=a[i][j]+a[i][j-1]; } } cout<<a[x1][y1]<<endl; } return 0; }
解題感想:這道題考慮了很長時間,就是中間過程的分析還不夠熟練,二維陣列運用還不夠熟練,還應該再多看一些類似的題。