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


    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
  • 相关阅读:
    《校园封神榜》第二阶段个人工作总结——第五天
    寻找水王2——寻找三个小水王
    站立会议04(第二次冲刺)
    站立会议03(第二次冲刺)
    站立会议02(第二次冲刺)
    站立会议01(第二次冲刺)
    测试计划
    评价cnblogs.com的用户体验
    第一次冲刺各组评价的回复
    第一次冲刺对各组的评价
  • 原文地址:https://www.cnblogs.com/Lamboofhome/p/16342143.html
Copyright © 2020-2023  润新知