題目:過河卒
問題編號:69
如圖,a 點有乙個過河卒,需要走到目標 b 點。卒行走規則:可以向下、或者向右。同時在棋盤上的任一點有乙個對方的馬(如上圖的c點),該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。例如上圖 c 點上的馬可以控制 9 個點(圖中的p1,p2 … p8 和 c)。卒不能通過對方馬的控制點。
棋盤用座標表示,a 點(0,0)、b 點(n,m)(n,m 為不超過 25 的整數,並由鍵盤輸入),同樣馬的位置座標是需要給出的(約定: c<>a,同時c<>b)。現在要求你計算出卒從 a 點能夠到達 b 點的路徑的條數。
鍵盤輸入
b點的座標(n,m)以及對方馬的座標(x,y)
螢幕輸出
乙個整數(路徑的條數)。
6 6 3 217
一、思路
感覺這是個回溯或者暴力求解的題目,怎麼就可以用動態規劃,發現還真可以
根據題目和加法原理
f(n,m) = f(n-1,m) + f(n, m-1) 上方和左方的可達路徑之和,最優子結構
f(n-1, m) = f(n-2, m) + f(n-1, m-1)
f(n, m-1) = f(n-1, m-1) + f(n, m-2)
重複了f(n-1, m-1) 後面會重複更多,子問題重疊
利用2維陣列來描述f[i][j]
怎麼來遞推求解,初始條件是什麼
原本我想從0.0開始向右,向下,發現要考慮的邊界條件和馬的控制點,太多了
還是從遞推式入手容易,初始條件為
f[0][i],第一行,只像右移動
f[i][0],第一列,只像下移動
然後從1,1開始求解,將馬足控制點設為-2,此點不走,且,如果上或者左側點為它,則把它記為0路徑相加
if (f[i][j]==-2) continue;
f[i][j] = f[i-1][j]<0 ? 0 : f[i-1][j]
f[i][j] += f[i][j-1]<0 ? 0 : f[i][j-1];
因為題目最大資料為50裡取25的排序數,用高精度
所以又加了第三維,來描述位數
二、演算法
f[26][26][2],來描述當走到第i,j位置時的路徑數f[i][j][2](低位為[0],高位為[1])
結構體 horse[9] 來描述定義,9個馬的控制方位,用於初始化為:-2
1、讀入b:n,m ;x,y
2、初始化
f[0][i]和f[i][0]和f[0][0]=1
3、動態規劃求解,二重迴圈
第一重:行
第二重:列
高精度,加法
4、輸出結果f[n][m][0-1]
輸出最高位
補0輸出低位
三、錯誤總結
先是沒有用高精度,只有2個得分點
後面用了,是6個得分點
1630 -->1645 輸出的結果,比正確的少了十幾個路徑數
那麼高精度和動態規劃演算法總體應該是沒問題的,
最後發現是在初始化行列的時候,將n,m位置寫錯導致
終於ac
**如下:
#include #include struct point
;#define bits 10000000
//輸出測試結果
void printf(int f[26][26][2], int n, int m)
} printf(f, n, m);
//初始化第一行
f[0][0][0] = 1;
for (i=1; i<=m; i++)
f[0][i][0] = f[0][i-1][0]<0 ? 0 : f[0][i-1][0];
} //初始化第一列
for (i=1; i<=n; i++)
f[i][0][0] = f[i-1][0][0]<0 ? 0 : f[i-1][0][0];
} printf(f, n, m);
//動態規劃求解
//f(i,j)=f(i-1,j)+f(i, j-1);
for (i=1; i<=n; i++)
f[i][j][0] += f[i-1][j][0]<0 ? 0 : f[i-1][j][0];
f[i][j][1] += f[i-1][j][1];
f[i][j][0] += f[i][j-1][0]<0 ? 0 : f[i][j-1][0];
if (f[i][j][0]>bits)
f[i][j][1] += f[i][j-1][1];
} } printf(f, n, m);
//輸出結果
//找到最高位
i=1;
while (!f[n][m][i])
//輸出最高位
cout<=0; j--)
bit *= 10;
} //輸出0
for (int k=1; k<=7-cnt; k++)
cout<
過河卒(動態規劃)
題目描述 棋盤上aa點有乙個過河卒,需要走到目標bb點。卒行走的規則 可以向下 或者向右。同時在棋盤上cc點有乙個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為 馬攔過河卒 棋盤用座標表示,aa點 0,0 0,0 bb點 n,m n,m nn,mm為不超過2020的整數 ...
動態規劃 洛谷 過河卒
第 dp i j 個位置到達的可能性是第 dp i 1 j 個位置方案數 第 dp i j 1 個位置的方案數 題目中馬以 日 字形沿各方向跳出的點才是題目中所謂馬控制的九個點,而不是馬座標周圍的九個點 題目的座標系是以第四象限為平面,卒可向下或向右 dfs求路徑總數要設定邊界 1 到達目的地結束 ...
P1002 過河卒 動態規劃
傳送門 思路 搜尋tle了,只能dp了。dp i j dp i j 1 dp i 1 j 對於 點 i,j 只有 i,j 1 和 i 1,j 這兩種選擇,那麼可以推出狀態轉移方程 先定義dp 0 0 1 dp i j dp i 1 j dp i j 1 但如果這樣的話,以0,0為起點會出現點被覆蓋的...