棋盤上 a點有乙個過河卒,需要走到目標 b點。卒行走的規則:可以向下、或者向右。同時在棋盤上 c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。
棋盤用座標表示,a點 (0,0)、b點 (n,m),同樣馬的位置座標是需要給出的。
現在要求你計算出卒從 a 點能夠到達 b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。
一行四個正整數,分別表示 b點座標和馬的座標。
乙個整數,表示所有的路徑條數。
輸入 6 6 3 3
輸出 6
對於 100%100 %100% 的資料,1≤n,m≤201 \le n, m \le 201≤n,m≤20,0≤0 \le0≤ 馬的座標 ≤20\le 20≤20。
noip 2002 普及組第四題
馬走日這一點不要忽視。
(對於不下象棋的人很容易忽視,比如說,我)
接下來分析題目
可以看到 卒的行走規則為向右或者向下,從這裡我們可以推斷出,乙個點,它的可能**只有兩個,乙個是左邊,乙個是上面。因此,這裡我們的遞推式出現了,即到達(i,j)點的路徑為到達左邊點的路徑和到達上邊點的路徑之和。
遞推式如下:a(i,j)=a(i-1,j)+a(i,j-1)
這也是一條自底向上的動態規劃的題。
因此下面為這道題的解法**
#includeusing namespace std;
int main()
;//座標初始化為0.並且將陣列的下標範圍設定的稍微大一點
cin>>endcolumn>>endrow>>horsecolumn>>horserow;
int horse[30][30]=;
coord[startcolumn][startrow]=1;
endcolumn+=2;
endrow+=2;
horsecolumn+=2;
horserow+=2;
//統一加上2是為了等一下加加減減的時候不至於越界
horse[horsecolumn-2][horserow+1]=1;
horse[horsecolumn+2][horserow+1]=1;
horse[horsecolumn-1][horserow+2]=1;
horse[horsecolumn+1][horserow+2]=1;
horse[horsecolumn+2][horserow-1]=1;
horse[horsecolumn+1][horserow-2]=1;
horse[horsecolumn-1][horserow-2]=1;
horse[horsecolumn-2][horserow-1]=1;
horse[horsecolumn][horserow]=1;
//標記馬可以走到的位置
/*這裡可以推斷出遞推式
因為題目中給出只能夠走右邊或者下邊,因此相應的,乙個點的位置也只能是上邊或者是左邊
這樣我們得到遞推式:
coord[i][j]=coord[i-1][j]+coord[i][j-1]
*/ int i=0,j=0;
for(i=2;i<=endcolumn;i++)
else
{//if(coord[i][j]這道題相對來說還是比較簡單,但是需要注意的是它的路徑數可能很多,需要申請的範圍為long long int
另外,最初我在寫這道題的時候比較傾向於用指標來寫,但是那樣會超過時間,所以最後被捨棄了。
洛谷 P1002 過河卒
棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在要求你計算...
洛谷P1002過河卒
dp水題,我都會做 我們考慮地圖上i,j的位置可以怎麼過來,因為卒只能向下或向右,所以當前位置只能由它的上方或左方轉移過來,所以f i j f i 1 j f i j 1 然後考慮邊界情況,沿著上沿和左沿只能向乙個方向走,所以f i 0 0,f 0 i 0,這是不考慮有馬的情況,當馬加入圖中後,我們...
洛谷 P1002 過河卒
棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過20的整數 同樣馬的位置座標是需要給出的。現在要求你計算...