蓝桥杯—跳跃(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
思路
- 将能走的坐标列举出来,以便后续的遍历
- 在每次走到一个新的坐标处时,要将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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人