走迷宫

来源:互联网 发布:城觅倒闭知乎 编辑:程序博客网 时间:2024/05/01 07:47

走迷宫

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

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

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

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

输入
有多组测试数据,以EOF为输入结束的标志
第一行: N 表示迷宫是N*N方阵 (2≤ N≤ 100)
接下来有N行, 每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。
输出
输出为一个整数,表示路径上最高难度与和最低难度的差。
样例输入
51 1 3 6 81 2 2 5 54 4 0 3 38 0 2 3 44 3 0 2 1
样例输出
2
二分加深搜,先二分每个值,再用深搜卡比是否可行
 #include <stdio.h>#include <string.h>#include <iostream>using namespace std;int n;const int MAX = 150;int map[MAX][MAX];bool vis[MAX][MAX];int nMax, nMin;int low, high;inline int max(int a, int b){return a > b ? a : b;}inline int min(int a, int b){return a > b ? b : a;}const int dx[4] = {0, 0, 1, -1};const int dy[4] = {1, -1, 0, 0};bool dfs(int x, int y){if(x == n && y == n)return true;for(int i = 0; i < 4; ++i){int tx = x + dx[i];int ty = y + dy[i];if(map[tx][ty] >= low && map[tx][ty] <= high && vis[tx][ty] == false){vis[tx][ty] = true;if(dfs(tx, ty))return true;}}return false;}bool f(int m){for(int i = nMin; i <= nMax - m; ++i){if(map[1][1] < i || map[1][1] > i + m)continue;if(map[n][n] < i || map[n][n] > i + m)continue;low = i;high = i + m;vis[1][1] = true;memset(vis, false, sizeof(vis));if(dfs(1, 1) == true)return true;}return false;}int main(void){while(~scanf("%d", &n)){nMax = -1;nMin = 999999;memset(map, -1, sizeof(map));for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){scanf("%d", &map[i][j]);nMax = max(nMax, map[i][j]);nMin = min(nMin, map[i][j]);}}int x = 0, y = nMax - nMin;while(x < y){int mid = (x + y) / 2;if(f(mid) == true){y = mid;}else{x = mid + 1;}}printf("%d\n", y);}return 0;}                


原创粉丝点击