4 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long #define lowbit(x) x&-x const int INF = 0x3f3f3f3f3f3f3f3f; const int N = 1e3 + 10; const int M = 1e6 + 10; const int K = 6; const int mod = 1e9 + 7; int n,m,k; int x1,x2,yy1,yy2; vector<pair<int,int>>g[N]; int a[N][N]; int dis[N][N][K]; bool vis[N][N][K]; int getid(int x,int y){ return (x-1)*m+y; } int movex[4]={1,-1,0,0}; int movey[4]={0,0,1,-1}; struct node{ int x,y,k,res; }; struct cmp{ bool operator()(node u,node v){ return u.res>v.res; } }; queue<node>q; int ans=INF; bool f[N][K]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); freopen("wormhole.in","r",stdin); freopen("wormhole.out","w",stdout); cin>>n>>m>>k; cin>>x1>>yy1>>x2>>yy2; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; g[a[i][j]].push_back({i,j}); } } memset(dis,0x3f,sizeof(dis)); dis[x1][yy1][k]=0; q.push({x1,yy1,k,0}); while(!q.empty()){ int x=q.front().x; int y=q.front().y; int k=q.front().k; q.pop(); if(vis[x][y][k]) continue; vis[x][y][k]=1; for(int l=0;l<4;l++){ int nx=x+movex[l]; int ny=y+movey[l]; if(nx<1|ny<1||nx>n||ny>m) continue; if(dis[nx][ny][k]>dis[x][y][k]+1){ dis[nx][ny][k]=dis[x][y][k]+1; q.push({nx,ny,k,dis[nx][ny][k]}); } } if(k==0) continue; if(f[a[x][y]][k]) continue; f[a[x][y]][k]=1; for(auto [nx,ny]:g[a[x][y]]){ if(dis[nx][ny][k-1]>dis[x][y][k]){ dis[nx][ny][k-1]=dis[x][y][k]; q.push({nx,ny,k-1,dis[nx][ny][k-1]}); } } } for(int i=0;i<=k;i++){ ans=min(ans,dis[x2][yy2][i]); } cout<<ans; return 0; }
- 1
信息
- ID
- 3724
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 未评定
- 标签
- 递交数
- 24
- 通过
- 5
- 上传者