藍橋杯—跳躍(C語言解法)
阿新 • • 發佈:2022-03-16
題目描述
小藍在一個n行m列的方格圖中玩一個遊戲。
開始時,小藍站在方格圖的左上角,即第1行第1列。
小藍可以在方格圖上走動,走動時,如果當前在第r行第c列,他不能走到行號比r小的行,也不能走到列號比c小的列。同時,他一步走的直線距離不超過3。
例如,如果當前小藍在第3行第5列,他下一步可以走到第3行第6列、第3行第7列、第3行第8列、第4行第5列、第4行第6列、第4行第7列、第5行第5列、第5行第6列、第6行第5列之一。
小藍最終要走到第n行第m列。
在圖中,有的位置有獎勵,走上去即可獲得,有的位置有懲罰,走上去就要接受懲罰。獎勵和懲罰最終抽象成一個權值,獎勵為正,懲罰為負。
小藍希望,從第1行第1列走到第n行第m列後,總的權值和最大。請問最大是多少?
輸入描述
輸入的第一行包含兩個整數 n, m表示圖的大小。
接下來n 行,每行m個整數,表示方格圖中每個點的權值。
其中,1≤n≤100,-10^4 ≤權值≤10^4 。
輸出描述
輸出一個整數,表示最大權值和。
輸入輸出示例
輸入
3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4
輸出
15
思路
- 將能走的座標列舉出來,以便後續的遍歷
- 在每次走到一個新的座標處時,要將tem值設定為0
- tem儲存能走到此座標的座標權值最大的點
程式碼
#include<stdio.h> int f[110][110]; int x[9]={0,0,0,-1,-2,-3,-1,-2,-1}; int y[9]={-1,-2,-3,0,0,0,-1,-1,-2}; int main(){ int n,m,i,j,tem,t; scanf("%d %d",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",&f[i][j]); } } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ tem=-100000; for(t=0;t<9;t++){ if(i+x[t]>0 && j+y[t]>0){ tem=tem>f[i+x[t]][j+y[t]]?tem:f[i+x[t]][j+y[t]]; } } if(tem!=-100000)f[i][j]+=tem; } } printf("%d",f[n][m]); return 0; }