ICode9

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

穿越雷区 (建图+最短路)

2022-06-04 17:01:57  阅读:137  来源: 互联网

标签:ch int 短路 back while 建图 push 雷区 dis


X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
  某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

  已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
  例如:
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  坦克车只能水平或垂直方向上移动到相邻的区。

  数据格式要求:

  输入第一行是一个整数n,表示方阵的大小, 4<=n<100
  接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
  A,B都只出现一次。

  要求输出一个整数,表示坦克从A区到B区的最少移动步数。
  如果没有方案,则输出-1

  例如:
  用户输入:
  5
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  则程序应该输出:
  10

  资源约定:
  X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
  某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

  已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
  例如:
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  坦克车只能水平或垂直方向上移动到相邻的区。

  数据格式要求:

  输入第一行是一个整数n,表示方阵的大小, 4<=n<100
  接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
  A,B都只出现一次。

  要求输出一个整数,表示坦克从A区到B区的最少移动步数。
  如果没有方案,则输出-1

  例如:
  用户输入:
  5
  A + - + -
  - + - - +
  - + + + -
  + - + - +
  B + - + -

  则程序应该输出:
  10

  资源约定:
  峰值内存消耗 < 512M
  CPU消耗 < 1000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

  注意: main函数需要返回0
  注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
  注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

  提交时,注意选择所期望的编译器类型。峰值内存消耗 < 512M
  CPU消耗 < 1000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

  注意: main函数需要返回0
  注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
  注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

  提交时,注意选择所期望的编译器类型。
View Problem

思路:就是建图而已,然后求一个最短路而已

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 1000005

template <class G > void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(ch<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
} 
// 9:33

int n,m;
vector <int> p[M];
char s[109][109];
int ss,t;

int dis[M];
struct cmp{
    bool operator ()(const int a,const int b)const
    {
        return dis[a]>dis[b];
    }
};
priority_queue <int,vector<int>,cmp> q;

int vis[M];
void dfs()
{
    memset(dis,0x3f,sizeof(dis));
    dis[ss]=0;
    q.push(ss);
    while(!q.empty())
    {
        while(!q.empty()&&vis[q.top()]) q.pop();
        if(q.empty()) break;
        int a=q.top();q.pop();vis[a]=1;
        if(a==t) break;
        for(ri i=0;i<p[a].size();i++)
        {
            int b=p[a][i];
            if(dis[b]>dis[a]+1)
            {
                dis[b]=dis[a]+1;
                q.push(b);
            }
        }
    }
}
int main(){
    
    cin>>n;
    for(ri i=1;i<=n;i++)
    {
        for(ri j=1;j<=n;j++)
        {
            cin>>s[i][j];
            if(s[i][j]=='A')
            ss=(i-1)*n+j;
            if(s[i][j]=='B')
            t=(i-1)*n+j;
            if(i>=2)
            {
                if(s[i-1][j]!=s[i][j])
                {
                    int a=(i-2)*n+j;
                    int b=(i-1)*n+j;
                    p[a].push_back(b);
                    p[b].push_back(a);
                }
            }
            if(j>=2)
            {
                if(s[i][j-1]!=s[i][j])
                {
                    int a=(i-1)*n+j-1;
                    int b=(i-1)*n+j;
                    p[a].push_back(b);
                    p[b].push_back(a);
                }
            }
        }
    }
    dfs();
    
    if(dis[t]==dis[0]) printf("-1");
    else printf("%d",dis[t]);
    return 0;
    
    
    
}
View Code

 

标签:ch,int,短路,back,while,建图,push,雷区,dis
来源: https://www.cnblogs.com/Lamboofhome/p/16342143.html

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

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

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

ICode9版权所有