題目描述 description
如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有乙個對方的馬(如上圖的c點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點(圖中的p1,p2 … p8 和 c)。卒不能通過對方馬的控制點。
棋盤用座標表示,a 點(0,0)、b 點(n,m)(n,m 為不超過 20 的整數,並由鍵盤輸入),同樣馬的位置座標是需要給出的(約定: c不等於a,同時c不等於b)。現在要求你計算出卒從 a 點能夠到達 b 點的路徑的條數。
1<=n,m<=15
輸入描述 input description
鍵盤輸入
b點的座標(n,m)以及對方馬的座標(x,y)
輸出描述 output description
螢幕輸出
乙個整數(路徑的條數)。
樣例輸入 sample input
6 6 3 2
樣例輸出 sample output 17
由題只能向左向右行走必然可以使用深度優先搜尋法尋找可達路徑數。首先應構建地圖,用0表示可以走的點用1表示不能走的點。
dfs
#include#include#includevoid bui(int n,int m,int x,int y);
void dfs(int x,int y,int n,int m);
int count,map[25][25];
int main()
void bui(int n,int m,int x,int y)
; int cur_y[8]=,i;
for(i=2;i<=n;i++) //構建空白地圖
memset(&map[i][2],0,(m+1)*4);
map[x][y]=1; //構建被馬控制的點
for(i=0;i<8;i++)
if(0<=x+cur_x[i]&&x+cur_x[i]<=n&&0<=y+cur_y[i]&&y+cur_y[i]<=m)
map[x+cur_x[i]][y+cur_y[i]]=1;
}void dfs(int x,int y,int n,int m)
遞推法
由於只能向下向右走則第0行中乙個點被馬控制則該點之後所有的點都不能到達即到達路徑數為0由圖
到達(1,1)點的路徑數為到達(0,1)(1,0)點路徑數的和其後邊所有點類推並且所有被馬控制的點的可達路徑數都為0;(應先構建第0行與第0列):
#include#include#includevoid bui(int n,int m,int x,int y);
void dfs(int x,int y,int n,int m);
int map[25][25];
int main()
void bui(int n,int m,int x,int y)//構建地圖
; int cur_y[8]=,i;
for(i=2;i<=n;i++)
memset(&map[i][2],0,(m-1)*4);
map[x][y]=1;
for(i=0;i<8;i++)
if(0<=x+cur_x[i]&&x+cur_x[i]<=n&&0<=y+cur_y[i]&&y+cur_y[i]<=m)
map[x+cur_x[i]][y+cur_y[i]]=1;
}void dfs(int x,int y,int n,int m) //遞推求解
for(map[x][y]=0,i=y,ok=1;i<=m;i++)//遞推第0列
for(x=3;x<=n;x++)
for(y=3;y<=m;y++)
map[x][y]=map[x][y]?0:map[x-1][y]+map[x][y-1];
}
過河卒 遞推
description 如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則 可以向下 或者向右。同時在棋盤上的任一點有乙個對方的馬 如上圖的c點 該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點 圖中的p1,p2 p8 和 c 卒不能通過對方馬的...
遞推與遞迴 過河卒
棋盤上 a 點有乙個過河卒,需要走到目標 b 點。卒行走的規則 可以向下 或者向右。同時在棋盤上 c 點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,a 點 0,0 b 點 n,m 同樣馬的位置座標是需要給出的。現在要求你計算出卒從 a...
過河卒 bfs搜尋
一共有三份 分別是只會寫迷宮時的 會寫dfs時的 動態規劃的,洛谷上對應的分數是40,60,100 這份 只是自己用來練習bfs的,執行的話只有40,資料過大會超時,還不是一般的超時,當m n 20的時候,執行了一分鐘還沒結果。用二維陣列表示棋盤,與題目的棋盤相比,加上了外圍的邊界,所以座標會有變化...