1 条题解

  • 0
    @ 2026-8-16 10:26:01

    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

    暗符「Demarcation」(境界线) (Demarcation)

    信息

    ID
    3594
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    84
    已通过
    5
    上传者