遞推遞迴練習--L(馬攔過河卒)
阿新 • • 發佈:2019-02-18
題目簡述:棋盤上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;
}
解題感想:這道題考慮了很長時間,就是中間過程的分析還不夠熟練,二維陣列運用還不夠熟練,還應該再多看一些類似的題。