1 条题解

  • 0
    @ 2025-10-8 16:57:38

    【最短路+DP】:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=510, N2=N*N, INF=0x3f3f3f3f;
    typedef pair<int, int> PII;
    int dx[4]={-1, 1, 0, 0};
    int dy[4]={0, 0, -1, 1};
    int n, m, K, a[N][N], id[N][N], dis[N2][110];bool v[N2][110]; 
    char s[N][N]; 
    struct node
    {
        int x, y, z;
        bool operator< (const node &b) const {return x>b.x;}
    };
    vector<PII> G[N2]; 
    void  dijkstra()
    {
        memset(dis, 0x3f, sizeof(dis));
        for(int i=0; i<=K; i++) dis[1][i]=0;
        for(int i=1; i<=n*m; i++) dis[i][K+1]=0; 
        memset(v, 0, sizeof(v));
    	priority_queue<node> q; q.push({0, 1, 0});
        while(!q.empty())
        {
            int x=q.top().y, k=q.top().z; q.pop();
            if(v[x][k]) continue; v[x][k]=1;
            for(auto i: G[x])
            {
                int y=i.first, w=i.second;
                if(w==0)
                {
                    if(dis[y][k]>dis[x][k]+1)
                    {
                        dis[y][k]=dis[x][k]+1;
                        q.push({dis[y][k], y, k});
                    }
                }
                else
                {
                    if(dis[y][k+1]>dis[x][k]+1)
                    {
                        dis[y][k+1]=dis[x][k]+1;
                        q.push({dis[y][k+1], y, k+1});
                    }
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d%d", &n, &m, &K);
        memset(G, 0, sizeof(G));
        for(int i=1; i<=n; i++) 
        {
            scanf("%s", s[i]+1);
            for(int j=1; j<=m; j++)a[i][j]=s[i][j]-'0', id[i][j]=(i-1)*m+j;
        }
        for(int i=1; i<=n; i++) for(int j=1; j<=m; j++)
        {
            for(int k=0; k<=3; k++)
            {
                int x=i+dx[k], y=j+dy[k];
                if((x<1) || (y<1) || (x>n) || (y>m)) continue;
                int xx=id[i][j], yy=id[x][y];
                G[xx].push_back({yy, a[x][y]});
            }
        }
        dijkstra(); 
    	int ans=INF;for(int i=0; i<=K; i++) ans=min(ans, dis[n*m][i]);
        if(ans!=INF) printf("%d\n", ans);else printf("No Answer\n");
        return 0;
    }
    【BFS】:
    
    #include<bits/stdc++.h>
    #define pii array<int,3>
    using namespace std;
    int n,m,k,a[505][505],xx[5]={0,0,1,-1},yy[5]={1,-1,0,0},dis[505][505][105];
    queue<pii>q;
    int main(){
        scanf("%d %d %d",&n,&m,&k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%1d",&a[i][j]);
            }
        }
        memset(dis,-1,sizeof dis);
        dis[1][1][0]=0;
        q.push(pii{1,1,0});
        while(!q.empty()){
            int x=q.front()[0],y=q.front()[1],z=q.front()[2];
            q.pop();
            for(int i=0;i<4;i++){
                int nx=x+xx[i],ny=y+yy[i];
                if(nx<1||nx>n||ny<1||ny>m)continue;
                int nz=z+a[nx][ny];
                if(nz>k)continue;
                if(dis[nx][ny][nz]!=-1)continue;
                dis[nx][ny][nz]=dis[x][y][z]+1;
                if(nx==n&&ny==m){
                    printf("%d",dis[nx][ny][nz]);
                    return 0;
                }
                q.push(pii{nx,ny,nz});
            }
        }
        printf("No Answer");
        return 0;
    }
    
    • 1

    信息

    ID
    1536
    时间
    5000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    74
    已通过
    21
    上传者