1 条题解

  • 1
    @ 2023-8-18 18:25:40
    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    char mat[1005][1005];
    int book[1005][1005];
    int sx,sy,fx,fy;
    int nxt[4][2]={0,1,0,-1,1,0,-1,0};
    struct node{
    	int x,y,idx;
    	friend bool operator < (node a,node b){
    		return a.idx>b.idx;
    	}
    };
    priority_queue<node>q;
    int main(){
    	freopen("maze.in","r",stdin);
    	freopen("maze.out","w",stdout);
    	cin>>n>>m;
    	memset(book,0x3f,sizeof book);
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			cin>>mat[i][j];
    			if(mat[i][j]=='A'){//初始化起点
    				sx=i;
    				sy=j;
    			}
    			if(mat[i][j]=='B'){//初始化终点
    				fx=i;
    				fy=j;
    			}
    		}
    	}
    	q.push({sx,sy,0});//起点入队
    	book[sx][sy]=0;//初始化起点的各个数值
    	while(!q.empty()){//BFS开始
    		node tmp=q.top();
    		q.pop();//出队
    		if(tmp.x==fx&&tmp.y==fy){//到终点了
    			cout<<tmp.idx<<endl;
    			return 0;
    		}
    		for(int i=0;i<4;i++){
    			int nx=tmp.x+nxt[i][0];//下一步的x坐标
    			int ny=tmp.y+nxt[i][1];//下一步的y坐标
    			int idx=tmp.idx;//下一步的对小时间(初始化)
    			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&book[nx][ny]==0x3f3f3f3f){//没越界,没走过
    				if(mat[nx][ny]=='X'){//毒蘑菇
    					nx=tmp.x;
    					ny=tmp.y;
    					continue;
    				}
    				else if(mat[nx][ny]=='D'){//大龙
    					idx+=3;
    				}
    				else if(mat[nx][ny]=='S'){//小龙
    					idx+=2;
    				}
    				else{
    					idx+=1;//普通路
    				}
    				q.push({nx,ny,idx});//下一可行步入队
    				book[nx][ny]=min(book[nx][ny],idx);//更新最小值
    			}
    		}
    	}
    	cout<<-1<<endl;//无解输出-1
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    
    • 1

    信息

    ID
    1339
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    89
    已通过
    5
    上传者