馬攔過河卒

2021-08-04 22:19:08 字數 1112 閱讀 1389

problem description

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

input

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

output

乙個資料,表示所有的路徑條數。

example input

6 6 3 3

example output

think: 馬走「日」字, **實現起來就是對位置座標x、y,進行+-1、2操作。是馬可以一步到達的點(包括一開始馬的座標)。分析可知從某個點到達終點b的路徑條數是b點正上+左邊兩個點的路徑條數和。比如從(1,1)到(2,2),根據題目裡卒的行走規則有兩條路徑可走,1+1 = 2嘛。那麼問題來了,從起始位置(0,0),到終點b的過程中如果遇到「馬的控制點」怎麼辦?思考一下~肯定是從馬的控制點出發的路徑數為0了,因為相當於「出發點」不存在了。。。分析完了之後,就知道要開個兩個二維陣列,乙個儲存地圖—標記馬的控制點,再開個陣列來儲存每個點的路徑數(要根據馬的控制點初始化一下), 最後兩個for迴圈,一步步遞推模擬。

**如下,純c無新增

#include

#include

int f[20][20];

int g[20][20];

int main()

else //在邊界上還可以從**到該點?

} //是不是不能了,因為可以來的路被馬「截斷」了

for(i = 1; i <= m; i++)

else

} //一步步遞推

for(i = 1; i <= n; i++)

}printf("%d\n", f[n][m]); //輸出所有的路線和

return

0;}

馬攔過河卒

問題描述 棋盤上a 點有乙個過河卒,需要走到目標 b點。卒行走的規則 可以向下 或者向右。同時在棋盤上 c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a 點 0,0 b 點 n,m n,m為不超過 15的整數 同樣馬的位置座標是需要...

馬攔過河卒

如圖,a點有乙個過河卒,需要走到目標 b點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c點上的馬可以控制 9個點 圖中的p1,p2 p8和 c 卒不能通過對方馬的控制點。棋盤用座標表示,a點 0,...

馬攔過河卒

problem description 棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則 可以向下 或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a點 0,0 b點 n,m n,m為不超過15的整數 同樣...