# 題目
zerojudge j125. 4. 蓋步道
# 解題思路
目前沒東西...
# 程式碼
#include<bits/stdc++.h> | |
using namespace std; | |
#define N 305 | |
int a[N][N],d[4][2]={{-1,0},{0,1},{1,0},{0,-1}},n; | |
int dis[N][N]; | |
int prim(){ | |
priority_queue<vector<int>> q; | |
// for(int i=0;i<n+1;i++) for(int j=0;j<n+1;j++) dis[i][j]=0; | |
memset(dis,0,sizeof(dis)); | |
q.push({0,1,1}); | |
while(!q.empty()){ | |
auto e=q.top(); | |
q.pop(); | |
if(e[1]==n && e[2]==n) return -e[0]; | |
if(dis[e[1]][e[2]]) continue; | |
dis[e[1]][e[2]]=1; | |
for(int i=0;i<4;i++){ | |
int r=e[1]+d[i][0],c=e[2]+d[i][1]; | |
if(!dis[r][c]){ | |
q.push({min(e[0],-abs(a[r][c]-a[e[1]][e[2]])),r,c}); | |
} | |
} | |
} | |
return -1; | |
} | |
int bfs(int h){ | |
queue<pair<int,int>> q; | |
q.push({1,1}); | |
// for(int i=0;i<n+1;i++) for(int j=0;j<n+1;j++) dis[i][j]=0; | |
memset(dis,0,sizeof(dis)); | |
dis[1][1]=0; | |
while(!q.empty()){ | |
auto e=q.front(); | |
q.pop(); | |
int x=e.first,y=e.second; | |
if(x==n && y==n) return dis[n][n]; | |
for(int i=0;i<4;i++){ | |
int r=x+d[i][0],c=y+d[i][1]; | |
if(dis[r][c]==0 && abs(a[r][c]-a[x][y])<=h){ | |
dis[r][c]=dis[x][y]+1; | |
q.push({r,c}); | |
} | |
} | |
} | |
return -1; | |
} | |
int main(){ | |
cin>>n; | |
for(int i=0;i<=n+1;i++){ | |
a[0][i]=a[i][0]=a[n+1][i]=a[i][n+1]=1e9; | |
} | |
for(int i=1;i<=n;i++) | |
for(int j=1;j<=n;j++){ | |
cin>>a[i][j]; | |
} | |
int k=prim(); | |
cout<<k<<"\n"<<bfs(k); | |
} |