Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。

这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线。走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与最小难度值之差是最小的。当然了,或许这样的路径不是最短路径。

机器人卡多现在在迷宫的左上角(第一行,第一列)而出口在迷宫的右下角(第N行,第N列)。

卡多很聪明,很快就找到了这样的一条路径。你能找到吗?

输入描述:

有多组测试数据,以EOF为输入结束的标志
第一行:         N     表示迷宫是N*N方阵        (2≤ N≤ 100)
接下来有N行,  每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。</span>

输出描述:

输出为一个整数,表示路径上最高难度与和最低难度的差。</span>

思路: 这题我也是按照网上代码的思路写的,二分+DFS,温老师用Dijkstra写的,太强了膜一波。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e2 + 10;
int d[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
int a[maxn][maxn];
int maxx, minx, n;
bool vis[maxn][maxn], flag;
void dfs(int x, int y, int l, int r)
{if(flag) return;if(a[x][y] < l || a[x][y] > r)return;if(x == n && y == n){flag = true;return;}for(int i = 0; i < 4; ++i){int xx = x + d[i][0];int yy = y + d[i][1];if(xx >= 1 && xx <= n && yy >= 1 && yy <= n && !vis[xx][yy]){vis[xx][yy] = true;dfs(xx, yy, l, r);}}
}bool slove(int d)
{flag = false;for(int i = minx; i <= maxx - d; ++i){memset(vis, false, sizeof(vis));int l = i, r = i + d;vis[1][1] = true;dfs(1, 1, l, r);if(flag)return true;}return false;
}int main()
{while(scanf("%d", &n) != EOF){maxx = 0, minx = 1e9;for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){scanf("%d", &a[i][j]);maxx = max(maxx, a[i][j]);minx = min(minx, a[i][j]);}}int l = 0, r = maxx - minx;while(l < r){int mid = (l + r) >> 1;if(slove(mid))r = mid;elsel = mid + 1;}printf("%d\n", r);}return 0;
}

最短路版

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9 + 7;
template<typename T1, typename T2> inline bool Min(T1 &a, const T2 &b){ if (b >= a) return false; a = b; return true; }
template<typename T1, typename T2> inline bool Max(T1 &a, const T2 &b){ if (b <= a) return false; a = b; return true; }
template<typename T1, typename T2> inline void Mad(T1 &a, const T2 &b){ a = (a + b) % MOD; if (a < 0) a += MOD; }const int N = 200;
int n, l;
int g[N][N], dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };
bool vis[N][N];
int dis[N][N];struct node
{int x, y, k;bool operator < (const node &o) const{return k > o.k;}
};
void Dijkstra()
{memset(vis, 0, sizeof(vis));memset(dis, 0x3f, sizeof(dis));dis[1][1] = abs(l - g[1][1]);priority_queue<node> pq;pq.push({ 1, 1, dis[1][1] });while (!pq.empty()){int x = pq.top().x, y = pq.top().y; pq.pop();vis[x][y] = 1;for (int i = 0; i < 4; ++i){int xx = x + dir[i][0], yy = y + dir[i][1];if (xx >= 1 && xx <= n && yy >= 1 && yy <= n){if (g[xx][yy] >= l && !vis[xx][yy] && max(g[xx][yy], dis[x][y]) < dis[xx][yy])Min(dis[xx][yy], max(g[xx][yy], dis[x][y])), pq.push({ xx, yy, dis[xx][yy] });}}}
}
int main()
{
#ifdef LOCAL//freopen("C:/input.txt", "r", stdin);
#endifwhile (cin >> n){for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)scanf("%d", &g[i][j]);int ans = INF;for (int i = 0; i <= g[1][1]; ++i){l = i;Dijkstra();Min(ans, dis[n][n] - l);}cout << ans << endl;}return 0;
}

第四届河南省程序设计大赛D nyoj306-走迷宫【二分DFS、最短路Dijkstra】相关推荐

  1. NYOJ--1236--挑战密室(第八届河南省程序设计大赛)

    挑战密室 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密码逃 ...

  2. nyoj 543 遥控器 第五届河南省程序设计大赛

    题目: 遥 控 器 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 Dr.Kong有一台高级电视机,这台电视机可以接受100个频道(从0到99编号).电视的配套遥控器有1 ...

  3. 第七届河南省程序设计大赛——A 海岛争霸

    第七届河南省程序设计大赛 A 海岛争霸 内存限制:64MB 时间限制:1s Special Judge: No 题目描述: 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海 ...

  4. 第九届河南省程序设计大赛 D 导弹发射

    第九届河南省程序设计大赛 D 导弹发射 内存限制:64MB 时间限制:1s Special Judge: No 题目描述: Alpha 机构研发出一种新型智能导弹,它能够在雷达检测到的区域内,选择一条 ...

  5. 第七届河南省程序设计大赛~~海岛争霸(nyoj 1248)

    海岛争霸 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的 ...

  6. 第八届河南省程序设计大赛~~挑战密室 nyoj 1236

    挑战密室 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室.Dr. Kong必须尽快找到解锁密码逃 ...

  7. nyoj1249 物资调度 (第七届河南省程序设计大赛)

    物资调度 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2 描述 某地区发生了地震,灾区已经非常困难,灾民急需一些帐篷.衣物.食品和血浆等物资.可通往灾区的道路到处都是塌方 ...

  8. 【华为机试】【校招】【Java】机器人走迷宫(DFS)

    ■ 题目描述 [机器人走迷宫] 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只 ...

  9. nyoj 309 bobsledding 即河南省第四届大学生程序设计大赛第七题

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=309 题意:很好理解就是选手可以选择加速,或者保持速度不变,但在要求的点处速度不能超过给定 ...

最新文章

  1. 修改Mysql默认 编码
  2. c#中重载单目运算符-_C#程序重载二进制运算符(-,*,/)
  3. 步步为营:Asp.Net序列化Json格式的两种方法
  4. springmvc框架原理分析
  5. Activity简介
  6. 利尔达NB-IOT的PSM和eDRX低功耗模式笔记
  7. BIEE叙述图导航实例
  8. 开发者的盛宴Google I/O 2016
  9. java 枚举嵌套枚举_java – 如何使用枚举与分组和分组层次/嵌套
  10. Windows Server 2008 R2将tomcat添加进系统服务
  11. 大咖分享|汪国强:数字化风控下,数据资产如何助力企业降本增效?
  12. WIN7系统设置保护视力的豆沙绿过程
  13. 我的知识网络结构图(2019)
  14. C-11 Problem H: 开宝箱2
  15. day9-字符串和集合作业
  16. 剑指offer——栈
  17. L2TP协议及AVP
  18. codeforces1367D 思维模拟
  19. Windows XP 缩略图不显示文件名
  20. 用scrapy+selenium + phantomjs 爬取vip网页,保存为json格式,写入到mysql数据库,下载图片(一)

热门文章

  1. oracle如何查看pdb,Oracle基础操作——CDB-PDB
  2. JavaScript call,apply,bind详解及实现
  3. 无领导小组讨论案例及其分析2
  4. 万能乘法速算法大全_小学数学加减乘除【速算法】都在这里! 寒假让孩子练一练...
  5. 随意细解:UI -- 初级数据持久化
  6. 隔一段时间撸一次,特别香,HashMap中remove、getOrDefault源码,一遍一遍、又一遍
  7. 用循环不停地输出2的倍数
  8. influxdb基础(三)——influxdb按时间分片存储数据(shard和shard group)
  9. 长尾词挖掘-长尾词挖掘工具-长尾关键词挖掘软件
  10. 使用Python3和BeautifulSoup爬取笑话网站内容,并导入Excel