8.6胖胖的牛牛(每日一题)

人言可畏,人言何所谓 2022-08-06 11:33:19
加精

 

#include<bits/stdc++.h>
using namespace std;

typedef pair<int ,int >PII;
const int maxn=1e5;
const int max1=105;
int dx[4]= {1,0,-1,0},dy[4]= {0,1,0,-1};
int dist[maxn];
vector<int>edges[maxn];
char mp[max1][max1];
bool vis[maxn];
int e[maxn],ne[maxn],h[maxn],w[maxn],idx;
int st,ed;
map<pair<int ,int >,int >mo;
int ans=0x3f3f3f3f,cnt=1;

void add(int a,int b,int c)
{
    e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}

void dijkstra(int start)
{
    memset(dist, 0x3f,sizeof dist);     //初始化距离  0x3f代表无限大
    memset(vis, false,sizeof vis);

    dist[start]=0;  //第一个点到自身的距离为0

    priority_queue<PII,vector<PII>,greater<PII>>mo;

    mo.push({0,start});
    while(mo.size())
    {
        auto t=mo.top();
        mo.pop();
        int ver=t.second,distance=t.first;
        if(vis[ver]) continue;
        vis[ver]=1;
        for(int i=h[ver];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dist[j]>w[i]+distance)
            {
                 dist[j]=w[i]+distance;
                 mo.push({dist[j],j});
            }
        }

    }

    for(int dd=0;dd<=3;dd++)
    {
        ans=min(dist[ed+dd],ans);
    }

}

int main()
{
    int n,m,i,j,t;
    memset(h,-1,sizeof h);
    cin>>n;getchar();
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>mp[i][j];
            int x1=i,x2=j;
            if(x1<0||x1>=n||x2<0||x2>=n||mp[x1][x2]=='x') continue;
            if(mp[i][j]=='A') st=cnt;
            if(mp[i][j]=='B') ed=cnt;
            mo[{x1,x2}]=cnt;
            cnt+=4;
        }
    }

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(mp[i][j]=='x') continue;

            for(int k=0;k<4;k++)
            {
                int x1=i+dx[k],x2=j+dy[k];
                if(x1<0||x1>=n||x2<0||x2>=n||mp[x1][x2]=='x') continue;
                int d1=mo[{i,j}],d2=mo[{x1,x2}];
                for(int dd=0;dd<=3;dd++)
                {
                    int xx=d1+dd,yy=d2+k;
                    if(dd==k)add(xx,yy,0),add(yy,xx,0);
                    else add(xx,yy,1),add(yy,xx,1);
                }
            }
        }
    }

    for(int dd=0;dd<=3;dd++)
    {
        int bh=st+dd;
        dijkstra(bh);
    }

    if(ans==0x3f3f3f3f){
        cout<<-1<<endl;
    }
    else {
        cout<<ans<<endl;
    }
    return 0;
}

...全文
27 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
高校算法学习社区

2.4w+

社区成员

和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream_Y.Ocean
  • ღCauchyོꦿ࿐
加入社区
帖子事件
创建了帖子
2022-08-06 11:33
社区公告

为了充分激发大家的创作热情和发文贡献,这里规定了高效算法学习社区对于积分榜的贡献排行榜的奖措施:

总榜奖励:(截止于2023年4月1日)

1.总榜第一:现金三百元

2.总榜第二与第三:Acwing算法课一套(价值150元可提现)

月榜:(从2020.年4月1日开始,每月一号结算)

1.月榜前三:请喝奶茶一杯

更多详细可看下:https://docs.qq.com/doc/DVnZJbkFPc1BNU2x2