1 条题解
-
0
【最短路+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
- 上传者