1 条题解
-
0
S.......#
#......S#
花费1,滑行
S.......#
#......S#
#S.....##
花费2,走旁边
#include<bits/stdc++.h> using namespace std; int n,m,p,sx,sy,ex,ey; char a[1005][1005]; int b[4][1005][1005],dist[1005][1005],vis[1005][1005]; struct node{ int x,y; bool operator < (const node &d) const { return dist[x][y] > dist[d.x][d.y]; } }; priority_queue<node> q; int d[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; int main(){ freopen("Demarcation.in","r",stdin); freopen("Demarcation.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } cin>>sx>>sy>>ex>>ey; for(int j=1;j<=m;j++){ p = 0; for(int i=1;i<=n;i++){ if(a[i][j] == '#') p = i; else b[0][i][j] = p + 1; } p = 0; for(int i=n;i>=1;i--){ if(a[i][j] == '#') p = i; else b[1][i][j] = p - 1; } } for(int i=1;i<=n;i++){ p = 0; for(int j=1;j<=m;j++){ if(a[i][j] == '#') p = j; else b[2][i][j] = p + 1; } p = 0; for(int j=m;j>=1;j--){ if(a[i][j] == '#') p = j; else b[3][i][j] = p - 1; } } memset(dist,0x3f,sizeof(dist)); dist[sx][sy] = 0; q.push((node){sx,sy}); while(!q.empty()){ node dt=q.top(); q.pop(); if(dt.x==ex && dt.y==ey){ cout<<dist[dt.x][dt.y]<<endl; return 0; } if(vis[dt.x][dt.y]) continue; vis[dt.x][dt.y] = 1; int x=dt.x,y=dt.y; int de[4][2]={{b[0][x][y],dt.y},{b[1][x][y],dt.y},{dt.x,b[2][x][y]},{dt.x,b[3][x][y]}}; for(int i=0;i<4;i++){ int dx=de[i][0]; int dy=de[i][1]; if(dx<1 || dy<1 || dx>n || dy>m || a[dx][dy]=='#') continue; if(dist[dx][dy] > dist[dt.x][dt.y] + 1){ dist[dx][dy] = dist[dt.x][dt.y] + 1; q.push((node){dx,dy}); } } for(int i=0;i<4;i++){ int dx=dt.x+d[i][0]; int dy=dt.y+d[i][1]; if(dx<1 || dy<1 || dx>n || dy>m || a[dx][dy]=='#') continue; if(dist[dx][dy] > dist[dt.x][dt.y] + 2){ dist[dx][dy] = dist[dt.x][dt.y] + 2; q.push((node){dx,dy}); } } } cout<<-1<<endl; return 0; }
- 1
信息
- ID
- 3594
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 84
- 已通过
- 5
- 上传者