• 【NOIP模拟赛180503】活蹦乱跳的香穗子


    题目描述

    香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值

    跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.

    香穗子可以从任意的格子出发,在任意的格子结束,

    那么她最多能跳几次?

    输入

    第一行n,m,表示田野的长和宽

    接下来n行,每行m个数,表示该格的价值

    输出

    一个数,表示最多跳得次数

    样例输入

    2 2
    2 5
    -1 3

    样例输出

    2

    提示

    n,m<=100

    答案保正小于Maxlongint

    代码


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,g[101][101];
    struct Point{
        int x,y;
    }q[1000000];
    int dis[101][101];
    int ans=0;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    void bfs(int xx,int yy)
    {
        memset(dis,-1,sizeof(dis));
        int f=1,e=1;
        Point s;
        s.x=xx,s.y=yy,dis[xx][yy]=0;
        q[1]=s;
        while(f<=e)
        {
            Point u=q[f++];
            for(int i=0;i<4;i++)
            {
                Point v;
                v.x=u.x+dx[i],v.y=u.y+dy[i];
                if(v.x<1||v.x>n||u.y<1||v.y>m) continue;
                if(g[v.x][v.y]<=g[u.x][u.y]) continue;
                if(dis[v.x][v.y]>=dis[u.x][u.y]+1) continue;
                dis[v.x][v.y]=dis[u.x][u.y]+1;
                if(dis[v.x][v.y]>ans) ans=dis[v.x][v.y];
                q[++e]=v;
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&g[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                bfs(i,j);
            }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    【codevs1227】方格取数2(最大流费最大流-模板
    【ZJOI2008】【BZOJ1033】杀蚂蚁(占坑待填
    python基础学习1-流程控制和判断
    python基础学习1-变量定义赋值,屏幕输入输出
    Jzoj5237 最长公共子序列
    Jzoj5236 利普希茨
    [置顶] 欢迎使用CSDN-markdown编辑器
    Jzoj5235 好的排列
    Jzoj5234 外星人的路径
    Jzoj5231 序列问题
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12587130.html
Copyright © 2020-2023  润新知