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

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。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    poj题目分类

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

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

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

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

    标题中的"POJ第1861题源码"指的是编程竞赛网站POJ(Programming Online Judge)上的第1861道题目,该题目通常会涉及到一个特定的算法或编程问题,而源码则指的是参赛者提交的解决该问题的程序代码。在描述和标签中...

    poj各种分类

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

    poj 3414解题报告

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

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ1201-Intervals

    【标题】"POJ1201-Intervals" 是北京大学在线编程平台POJ上的一道题目,这道题目主要涉及计算机科学中的算法设计与分析,尤其是数据结构和时间复杂度优化方面的知识。 【描述】"北大POJ1201-Intervals 解题报告+AC...

    POJ1010-STAMPS

    【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...

    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)

    POJ.rar_poj java_poj1048

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

    POJ1850-Code

    【标题】"POJ1850-Code"是一个关于北京大学在线编程平台POJ(Problem Online Judge)上的一道题目1850的解题报告和解决方案。这道题目涉及了算法设计和编程实践,是计算机科学教育中常见的训练方式,旨在提升学生的...

    POJ2503-Babelfish

    【标题】"POJ2503-Babelfish"是一个来自北京大学在线判题系统(POJ,Problem Online Judge)的编程题目。该题目要求参赛者编写程序解决特定的算法问题,通过编程语言实现,然后提交代码以供系统自动评测。 【描述】...

Global site tag (gtag.js) - Google Analytics