蓝桥杯---跳跃

跳跃

题目描述
小蓝在一个 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

运行限制
最大运行时间:1s
最大运行内存: 128M
思路:dfs搜索!

#include<iostream>
#include<cstring>
using namespace std;
int dir[9][2]={
    
    {
    
    0,1},{
    
    0,2},{
    
    0,3},{
    
    1,0},{
    
    1,1},{
    
    1,2},{
    
    2,0},{
    
    2,1},{
    
    3,0}};
int n,m;
int M[102][102];
int M_mark[102][102];
int ans=-999999;

void dfs(int x,int y,int sum)
{
    
    
    M_mark[x][y]=1;
    if(sum<=ans)return ;
    if(x==n&&y==m){
    
    
        ans=sum;
    }else{
    
    
        for(int i=0;i<9;i++){
    
    
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];

            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&M_mark[xx][yy]==0){
    
    
                dfs(xx,yy,sum+M[xx][yy]);
                M_mark[xx][yy]=0;
            }
        }
    }
}

int main()
{
    
    
    memset(M_mark,0,sizeof M_mark);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    
    
        for(int j=1;j<=m;j++){
    
    
            cin>>M[i][j];
        }
    }
    dfs(1,1,M[1][1]);
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/115429024