ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1021 ObstacleCourse障碍训练课 优先队列+bfs+转弯

2022-08-19 13:31:44  阅读:170  来源: 互联网

标签:1021 room int ObstacleCourse pos st 训练课 idex dist


链接:https://ac.nowcoder.com/acm/contest/26077/1021
来源:牛客网

题目描述

考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了’x’。例如下图:

. . B x .
. x x A .
. . . x .
. x . . .
. . x . .

 

贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。

输入描述:

第 1行: 一个整数 N 行

2..N + 1: 行 i+1 有 N 个字符 (‘.’, ‘x’, ‘A’, ‘B’),表示每个点的状态。

输出描述:

行 1: 一个整数,最少的转弯次数。
示例1

输入

复制
3
.xA
…
Bx.

输出

复制
2

 分析

和1020一样

#include<bits/stdc++.h>
using namespace std;
const int N=1e6,M=110;
typedef pair<int,int>PII;
int h[N],e[N],ne[N],w[N],dist[N],idex,n,m,End,dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool st[N];
map<PII,int>mp;
char room[M][M];
int res=0x3f3f3f3f;
void add(int a,int b,int c){
    e[idex]=b;
    ne[idex]=h[a];
    w[idex]=c;
    h[a]=idex++;
} 
void Dijkstra(int s){
    priority_queue<PII,vector<PII>,greater<PII> >q;
    memset(dist,0x3f,sizeof(dist));
    memset(st,0,sizeof(st));
    dist[s]=0;
    q.push({0,s});
    while(!q.empty()){
        int pos=q.top().second;
        q.pop();
        if(st[pos])continue;
        st[pos]=true;
        for(int i=h[pos];i!=-1;i=ne[i]){
            if(dist[e[i]]>dist[pos]+w[i]){
                dist[e[i]]=dist[pos]+w[i];
                q.push({dist[e[i]],e[i]});
            }
        }
    }
    for(int i=0;i<4;i++){
        res=min(res,dist[End+i]);
    }
}
int main(){
    memset(h,-1,sizeof(h));
    int cnt=0,s;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>room[i][j];
            if(room[i][j]=='A')s=cnt;
            if(room[i][j]=='B')End=cnt;
            if(room[i][j]=='x')continue;
            mp[{i,j}]=cnt;
            cnt+=4;
        }
    }
    if(n==1){cout<<0<<endl; return 0;}
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(room[i][j]=='x')continue;
            for(int k=0;k<4;k++){
                int x1=i+dir[k][0],y1=j+dir[k][1];
                if(x1>n||x1<=0||y1>n||y1<=0||room[x1][y1]=='x')continue;
                int d1=mp[{i,j}],d2=mp[{x1,y1}];
                for(int z=0;z<4;z++){
                    int xx=d1+z,yy=d2+k;
                    if(z==k)add(xx,yy,0),add(yy,xx,0);
                    else add(xx,yy,1),add(yy,xx,1);
                }
            }
        }
    }
    for(int i=0;i<=3;i++){
        int ss=s+i;
        Dijkstra(ss);
    }
    cout<<res<<endl;
}

 

标签:1021,room,int,ObstacleCourse,pos,st,训练课,idex,dist
来源: https://www.cnblogs.com/er007/p/16601676.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有