|
发表于 2023-2-14 19:29:08
|
显示全部楼层
本楼为最佳答案
 比较简单,来写一写:
- #include<bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int n,m,k,x,y,px,py,h[3001][3001],d1[3001][3001],d2[3001][3001],v[3001][3001],ans;
- bool c[9000001];
- int dx[4]={0,1,0,-1};
- int dy[4]={-1,0,1,0};
- int bfs(int bx,int by,int ex,int ey,int d[][3001])
- {
- int ret=INF;
- queue<pair<int,int> > q;
- d[bx][by]=0;
- for(q.push(make_pair(bx,by));!q.empty();q.pop())
- {
- x=q.front().first;
- y=q.front().second;
- if(ret==INF&&v[x][y]) ret=d[x][y];
- for(int i=0;i<4;i++)
- {
- px=x+dx[i];
- py=y+dy[i];
- if(px>0&&px<=n&&py>0&&py<=m&&h[px][py]!=0&&d[px][py]==INF)
- {
- d[px][py]=d[x][y]+1;
- q.push(make_pair(px,py));
- }
- }
- }
- return ret;
- }
- int main()
- {
- cin>>n>>m>>k;
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- scanf("%d",&h[i][j]);
- }
- }
- for(int i=1;i<=k;i++)
- {
- scanf("%d %d",&x,&y);
- v[x][y]=1;
- }
- memset(d1,0x3f3f3f3f,sizeof d1);
- memset(d2,0x3f3f3f3f,sizeof d2);
- int dis1=bfs(1,1,n,m,d1);
- int dis2=bfs(n,m,1,1,d2);
- ans=min(dis1+dis2+2,d1[n][m]);
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- if(d1[i][j]==dis1&&v[i][j]) c[h[i][j]]=1;
- }
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;j++)
- {
- if(d2[i][j]==dis2&&v[i][j])
- {
- if(c[h[i][j]]) ans=min(ans,dis1+dis2+1);
- }
- }
- }
- if(ans==INF) ans=-1;
- cout<<ans<<endl;
- return 0;
- }
复制代码 |
评分
-
查看全部评分
|