# 題目

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);
}
更新於 閱讀次數 次