走迷宫
题目链接:Click Here~
题目分析:
一开始还以为是记忆化搜索,或者dp啥的。之后才知道因为数据小,只要dfs+二分。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100+5;
bool flag,vst[N][N];
int n,graph[N][N];
int dir[5][3]={{-1,0},{1,0},{0,-1},{0,1}};//up,down,left,right
void dfs(int u,int v,int L,int H)
{
if(flag||vst[u][v])
return;
if(u==n&&v==n){
flag = true;
return;
}
vst[u][v] = 1;
for(int i = 0;i < 4;++i){
int dx = u+dir[i][0];
int dy = v+dir[i][1];
if(dx<=0||dx>n||dy<=0||dy>n)
continue;
if(graph[dx][dy]<L||graph[dx][dy]>H)
continue;
dfs(dx,dy,L,H);
}
}
int main()
{
// freopen("Input.txt","r",stdin);
while(~scanf("%d",&n))
{
int maxv = -1,minv = 125;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j){
scanf("%d",&graph[i][j]);
maxv = max(maxv,graph[i][j]);
minv = min(minv,graph[i][j]);
}
int H,mid= 0,low = 0,high = maxv - minv;
while(low <= high)
{
flag = false;
mid = (low+high)/2;
for(int v = minv;v <= maxv-mid;++v){
H = mid + v;
if(graph[1][1]<v||graph[1][1]>H)
continue;
if(graph[n][n]<v||graph[n][n]>H)
continue;
memset(vst,0,sizeof(vst));
dfs(1,1,v,H);
if(flag)break;
}
if(flag)
high = mid-1;
else
low = mid+1;
}
printf("%d\n",low);
}
return 0;
}