DP DFS,回溯 馬踏過河卒

2021-09-10 23:54:28 字數 1525 閱讀 9184

題目描述

棋盤上a點有乙個過河卒,需要走到目標b點。卒行走的規則:可以向下、或者向右。同時在棋盤上c點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為「馬攔過河卒」。

棋盤用座標表示,a點(0, 0)、b點(n, m)(n, m為不超過20的整數),同樣馬的位置座標是需要給出的。現在要求你計算出卒從a點能夠到達b點的路徑的條數,假設馬的位置是固定不動的,並不是卒走一步馬走一步。

輸入一行四個資料,分別表示b點座標和馬的座標。(保證所有的資料有解)

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

複製樣例資料

6 6 3 3
樣例輸出

6
由於卒只能向下或者向右走,那麼想要到達棋盤上的乙個點,有兩種方式:從左邊的格仔過來,或者從上邊的格仔過來。所以,過河卒到達某點的路徑數目等於到達與其相鄰的左邊點和上邊點的路徑數目和

我們用d(i,j) 來表示到達點 (i,j) 的路徑數目。所以遞推式為:d(i,j)=d(i-1,j)+d(i,j-1)。根據遞推式發現,可以用逐行或逐列的遞推方法求出從起點到終點的路徑數目。對於邊界條件,因為(0,0)是卒的起始位置,那麼f(0,0)= 1。

這樣先標記好障礙點,那麼障礙點這一定d(i,j)一定等於0,最終遞推得到的d(n,m)就是所求方案數了。

dp**:

#includeusing namespace std;

typedef long long ll;

const int maxn=30;

ll dp[maxn][maxn];

int vis[maxn][maxn];

int r1[8]=;//橫向位移

int r2[8]=;//縱向位移

int main()

}dp[0][0]=1;

for(int i=0;i<=n;++i)

if(j)}}

cout宣告會超時,但思想還是值得學習的

**:#includeusing namespace std;

int total=0;

int b1,b2,h1,h2;

int wx[2]=,wy[2]=;//用於移動卒

int ri[9][2]=,,,,,,,,};//用於標記馬的控制範圍,別忘了馬初始的位置!

bool map_[20][20];//用於標記馬的範圍

bool check(int x,int y)//判斷是否符合要求

void dfs(int x,int y)//深度搜尋

}}///注意與下面寫法的對比

/*void dfs(int x,int y)//深度搜尋

}}*/

int main()

dfs(0,0);

cout<

return 0;

}

馬踏過河卒

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

馬踏過河卒

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

遞推問題之馬踏過河卒問題

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