`
xuela_net
  • 浏览: 503192 次
文章分类
社区版块
存档分类
最新评论

poj 2922 Honeymoon Hike

 
阅读更多

题意:给定一个n*n地图和高度,一个人从左上角地图开始,需要走到右下角的地图,问他走的路程中所到达的最大高度和最小高度的差最小是多少。

思路:二分答案,对于每一个高度差,可以用dfs或bfs检验是否能够到达目的地,一开始想法是每次传以前的最大和最小高度,然后在更新,这样重叠检验会超时,然后参考博客,需要枚举区间来优化。于是可以改枚举高度区间的办法来缩减时间。以起始点高度h,[h-mid,h]~[h,h+mid]。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 105
#define INF 0x7FFFFFFF
# define eps 1e-5
using namespace std;

int map[MAX][MAX];
int vis[MAX][MAX];
int dirx[4]= {1,0,0,-1};
int diry[4]= {0,1,-1,0};
int n,judge,small,big;

bool ok(int x,int y)
{
    if(x < 0 || x >= n || y < 0 || y >= n)
        return false;
    return true;
}

int dfs(int x,int y)
{
    if(map[x][y] < small || map[x][y] > big)
        return 0;
    if(x == n-1 && y == n-1)
    {
        return 1;
    }
    vis[x][y] = 1;
    for(int i=0; i<4; i++)
    {
        int xx = x + dirx[i];
        int yy = y + diry[i];
        if(ok(xx,yy) && !vis[xx][yy])
        {
            if(dfs(xx,yy))
                return 1;
        }
    }
    return 0;
}

int main()
{
    int t,i,j;
    int Casee=1;
    cin >> t;
    while(t--)
    {
        cin >> n;
        int high=0,low=205,mid;
        for(i=0; i<n; i++)
            for(j=0; j<n; j++)
            {
                scanf("%d",&map[i][j]);
                if(high < map[i][j])
                    high = map[i][j];
                if(low > map[i][j])
                    low = map[i][j];
            }
        printf("Scenario #%d:\n",Casee++);

        int ans = 0;
        high -= low;
        low = 0;
        mid = (high + low)/2;
        while(low <= high)
        {
            small = max(map[0][0]-mid,0);
            for(; small<=map[0][0]; small++)
            {
                big = small + mid;
                memset(vis,0,sizeof(vis));
                if(dfs(0,0))
                {
                    ans = mid;
                    break;
                }
            }
            if(small <= map[0][0])
                high = mid - 1;
            else
                low = mid + 1;
            mid = (high+ low)/2;
        }
        printf("%d\n",ans);
        cout << endl;
    }
    return 0;
}


分享到:
评论

相关推荐

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ第1861题源码POJ第1861题源码POJ第1861题源码POJ第1861题源码

    POJ第1861题源码 POJ第1861题源码 POJ第1861题源码

    poj题目分类

    * 较为复杂的动态规划:例如 poj1191、poj1054、poj3280、poj2029、poj2948、poj1925、poj3034。 数学 1. 组合数学: * 加法原理和乘法原理。 * 排列组合。 * 递推关系:例如 poj3252、poj1850、poj1019、poj...

    POJ1159-Palindrome

    北大POJ1159-Palindrome 解题报告+AC代码

    POJ入门题库(含解题思路和答案)

    这些题目是针对ACM竞赛(ACM International Collegiate Programming Contest,简称ICPC)中的编程训练,POJ(Problem Set for Online Judges)是一个在线的编程竞赛平台,提供了许多算法和逻辑思维的练习题目。...

    C语言Poj答案全完整打包

    C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友

    poj各种分类

    poj分类poj分类poj分类poj分类

    poj 3414解题报告

    poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告

    poj 1012解题报告

    poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告

    poj 2329解题报告

    poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告

    poj 1659解题报告

    poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告

    POJ1503解答,正确答案(已通过POJ)

    POJ1503解答 POJ1503解答,正确答案(已通过POJ)

    POJ2002-Squares

    北大POJ2002-Squares 解题报告+AC代码

    POJ.rar_poj java_poj1048

    POJ1048,加强版的约瑟夫问题 难度中等

    POJ1083的代码

    POJ1083的代码,POJ1083的代码,POJ1083的代码

    POJ题目分析与理解

    POJ题目分析与理解 POJ(Peking University Online Judge)是一款在线评测系统,旨在帮助程序员提高编程能力和解决问题的能力。该系统提供了大量的编程题目,涵盖了算法、数据结构、数学、动态规划、博弈论等多个...

    poj 百练 题目分类

    poj 百练 题目分类 poj 百练 题目分类是指在 POJ(Peking University Online Judge)平台上面的编程题目的分类,这些题目涵盖了多种编程领域,包括枚举、递归、模拟、数制转换、高精度计算、简单计算、字符串处理和...

    POJ题目简单分类(ACM)

    【标题】"POJ题目简单分类(ACM)" 涉及的知识点: 【描述】中的"学习起来更系统,更清爽"暗示了本话题旨在为ACM竞赛初学者提供一个有条理的学习路径。 【标签】"POJ 分类"表明我们将探讨的是基于POJ(Problemset On...

Global site tag (gtag.js) - Google Analytics