第四届河南省省赛 走迷宫 二分+DFS

题目思路:使用二分查找路径中最大值和最小值之间的差值,从而确定出一组minn和maxn,对此组的minn和maxn经行DFS,如果可以找到一条路径,其中的最大值,最小值在minn~maxn的范围内,则查找成功。继续向左查找,否则向右查找

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<queue>
#include<math.h>
#define INF 0x3f3f3f3f
#define MAX 105

using namespace std;

int Map[MAX][MAX],vis[MAX][MAX],v[4][2]={{1,0},{-1,0},{0,1},{0,-1}},n;

bool check(int x,int y)
{
    if(x>=1 && x<=n && y>=1 && y<=n && !vis[x][y])
        return true;
    return false;
}

bool DFS(int x,int y,int maxn,int minn)//深搜,若搜索过程中未发现 超越minn 和 maxn的值则搜索成功
{
    if(x==n && y==n)
        return true;
    for(int i=0;i<4;i++)
    {
        int next_x=x+v[i][0];
        int next_y=y+v[i][1];
        if(check(next_x,next_y) && (Map[next_x][next_y]<=maxn && Map[next_x][next_y]>=minn))
        {
            vis[next_x][next_y]=1;
            if(DFS(next_x,next_y,maxn,minn))
                return true;
        }
    }
    return false;
}

int main()
{
    int L,R,Mid,maxn,minn,ans;
    while(scanf("%d",&n)!=EOF)
    {
        memset(Map,0,sizeof(Map));
        minn=INF;
        maxn=-INF;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&Map[i][j]);
                minn=min(minn,Map[i][j]);
                maxn=max(maxn,Map[i][j]);
            }
        }
        L=abs(Map[n][n]-Map[1][1]);//首尾你无法避免,所以将其差的绝对值定为最左端
        R=maxn-minn;
        while(L<=R)//对差值进行二分查找
        {
            Mid=(L+R)/2;
            int ok=0;
            for(int i=minn;i<=maxn-Mid;i++)
            {
                if(Map[1][1] < i)
                    break;
                if(Map[1][1] > i+Mid)
                    continue;
                memset(vis,0,sizeof(vis));
                if(DFS(1,1,i+Mid,i))
                {
                    ans=Mid;
                    R=Mid-1;
                    ok=1;
                    break;
                }
            }
            if(!ok)
                L=Mid+1;
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间: 2024-10-13 01:04:51

第四届河南省省赛 走迷宫 二分+DFS的相关文章

SDUT 走迷宫(DFS)

走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n

第四届河南省acm省赛 走迷宫(二分法枚举差值和最大值最小值+DFS)

走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与

2753:走迷宫(dfs+初剪)//可以说是很水了。。。

总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不能斜着走. 输入 第一行是两个整数,R和C,代表迷宫的长和宽.( 1<= R,C <= 40)接下来是R行,每行C个字符,代表整个迷宫.空地格子用'.'表示,有障碍物的格子用'#'表示.迷宫左上角和右下角都是'.'. 输出 输出从左上角走到右下角至

nyoj306 走迷宫(搜索+二分)

题目306 题目信息 运行结果 本题排行 讨论区 走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看

NYOJ306 走迷宫(dfs+二分搜索)

题目描述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看谁能更快地找到一条路

数据结构之 栈与队列--- 走迷宫(深度搜索dfs)

走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. 输入 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1 <= n, m <= 6, (n, m) !=(1, 1)

第四届河南省acm省赛 BOBSLEDDING

BOBSLEDDING 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong has entered a bobsled competition because he hopes his hefty weight will give his an advantage over the L meter course (2 <= L<= 1000). Dr.Kong will push off the starting line at 1 meter per

河南省第四届acm省赛 表达式求值(栈的应用)

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 假设表达式可以简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图