1. 程式人生 > 其它 >藍橋杯—跳躍(C語言解法)

藍橋杯—跳躍(C語言解法)

題目描述

小藍在一個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

思路

  1. 將能走的座標列舉出來,以便後續的遍歷
  2. 在每次走到一個新的座標處時,要將tem值設定為0
  3. 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;
}