这题还能倒着走?
查看原帖
这题还能倒着走?
828664
Llx2022楼主2023/6/26 11:25

3个方向的记录

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e3+9;
int p[N][N];
int n,m;
int dx[]={1,0,0};
int dy[]={0,-1,1};
bool v[N][N];
bool check(int val){
    queue<pair<int,int> > q;
    for(int i=1;i<=m;i++){
        if(p[1][i]<=val){
            q.push({1,i});
        }
    }
    bool flag=0;
    memset(v,0,sizeof v);
    while(!q.empty()){
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        if(x==n) return true;
        if(v[x][y]) continue;
        v[x][y]=true;
        for(int i=0;i<3;i++){
            int xx=dx[i]+x;
            int yy=dy[i]+y;
            if(yy<=0||yy>m) continue;
            if(p[xx][yy]>val) continue;
            q.push({xx,yy});
        }
    }
    return false;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>p[i][j];
        }
    }
    int l=0,r=N;
    while(l<r){
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

4个方向的记录

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e3+9;
int p[N][N];
int n,m;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
bool v[N][N];
bool check(int val){
    queue<pair<int,int> > q;
    memset(v,0,sizeof v);
    for(int i=1;i<=m;i++){
        if(p[1][i]<=val){
            q.push({1,i});
        }
    }
    while(!q.empty()){
        int x=q.front().first;
        int y=q.front().second;
        q.pop();
        if(x==n) return true;
        if(v[x][y]) continue;
        v[x][y]=true;
        for(int i=0;i<4;i++){
            int xx=dx[i]+x;
            int yy=dy[i]+y;
            if(xx<1||xx>n||yy<1||yy>m) continue;
            if(p[xx][yy]>val) continue;
            q.push({xx,yy});
        }
    }
    return false;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>p[i][j];
        }
    }
    int l=0,r=N-1;
    while(l<r){
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

区别仅仅在bfs的方向 这是为什么呢?

2023/6/26 11:25
加载中...