蓝桥杯—跳跃(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;
} 
posted @   两颗不一样的西柚  阅读(413)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩