流浪地球2-月球支线

流浪地球2-月球支线

测试数据来自 dch123456/1063

题目背景

月球危机应对方案分为三步,
第一步,把全球核武器用空间站运抵月球,以相控阵方式,布设在直径四十六公里的坎帕努斯环形山。
第二步,串联全球核武器,以空间为中继卫星遥控引爆,引发月核聚变,使月球自行坍缩瓦解。
第三步,重启杜勒斯、东京、北京三地根服务器,恢复全球互联网,启动全球行星发动机,逃离月球残骸,踏上新征程。

彻底毁掉月球的能量,是全球核武总当量的十亿倍。我们目前集结的核弹总量,连根引线都算不上!所以,布设位置一定要精确,确保相控阵阵元聚焦点准确。

题目描述

在布设月球核弹前,对于地质的勘测必不可少,请你编写程序,辅助550W/moss进行对月球坎帕努斯环形山地质勘测结果的计算,得到各个位置是否能布设核弹。

输入格式

第一行两个整数x和z,由一个空格隔开
接下来有x * z行,每行x个数字,表示矿物的种类,其中,-1表示空腔,空腔上方不能布设核弹,x * x * z个数字中,每x * x个数字为一组,共z组,表示由下至上z层地质勘测结果。
第x * z + 1行有一个整数n
接下来有n行,每行有两个数字a和b,之间由一个空格隔开,表示在与a矿物空间曼哈顿距离≤b的位置里无法布设核弹
再接下来有一个整数m,下一行有m个整数,由一个空格隔开,表示危险的矿物,要进行计数。矿物群:有一角或一棱相邻的矿物块均属于同一矿物群。

输出格式

为了减小输出文件,使550W/moss算力集中在破译密码,因此前两行每行有x个正整数,由一个空格隔开,表示的是可布设核弹图的深度优先搜索遍历和宽度优先搜索遍历,可布设核弹图是一个x * x的01矩阵,在此我们将其看作一个邻接矩阵,1表示可布设核弹,0表示不可布设核弹。
接下来有m行,每行k个整数,表示第m种危险的矿物群的数量,为确定答案的唯一性,请输出升序排列的k个整数,两两由一个空格隔开。

输入输出样例明天做

数据范围

x≤100,z≤50,保证地址勘测输入图的每个数字的绝对值都≤20,n≤10,m≤10

//先把没写完的代码挂在这,供同学参考
#include<bits/stdc++.h>
using namespace std;
struct CannotLayout
{
    int MineralType,DangerousDistances;
    int SumCoordinate=0;
    struct CannotMineralCoordinate
    {
        int Abscissa,Ordinate,Vertical;
    }MineralCoordinate[500005];
}Cannot[15];
struct Dangerous
{
    int DangerousMineral,SumMineral=0;
    int MineralGroup[500005];
}Danger[15];
int x,z,Moon[105][105][55],Highest[105][105],n,m,Superficie,AnsDfs[105],AnsBfs[105];
bool MoonNuclear[105][105][55],Nuclear[105][105],Visit[105][105][55],VisitAns[105];
int Direction[26][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},
{1,0,0},{-1,0,0},{1,1,0},{1,0,1},{0,1,1},{-1,1,0},{1,-1,0},
{1,0,-1},{-1,0,1},{0,1,-1},{0,-1,1},{-1,-1,0},{-1,0,-1},
{0,-1,-1},{1,1,1},{-1,1,1},{1,-1,1},{1,1,-1},{-1,-1,1},
{-1,1,-1},{1,-1,-1},{-1,-1,-1}};
int SpaceManhattan(int,int,int,int,int,int);
void MarkHazard(int,int,int,int);
void FloodDfs(int,int,int,int);
void WdqerkDfs(int);
void WdqerkBfs();

int main()
{
    ios::sync_with_stdio(false);
    memset(Nuclear,true,sizeof Nuclear);
    memset(MoonNuclear,true,sizeof MoonNuclear);
    cin>>x>>z;
    for(int i=1;i<=z;i++)
        for(int j=1;j<=x;j++)
            for(int k=1;k<=x;k++)
            {
                cin>>Moon[j][k][i];
                if(Moon[j][k][i]!=0)
                    Highest[j][k]=max(Highest[j][k],z);
                if(Moon[j][k][i]==-1)
                    Nuclear[j][k]=false;
            }
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>Cannot[i].MineralType>>Cannot[i].DangerousDistances;
    cin>>m;
    for(int i=1;i<=m;i++)
        cin>>Danger[i].DangerousMineral;
    for(int i=1;i<=z;i++)
        for(int j=1;j<=x;j++)
            for(int k=1;k<=x;k++)
                for(int t=1;t<=n;t++)
                {
                    if(Moon[j][k][i]==Cannot[t].MineralType)
                    {
                        Cannot[t].MineralCoordinate[++Cannot[t].SumCoordinate].Abscissa=j;
                        Cannot[t].MineralCoordinate[Cannot[t].SumCoordinate].Ordinate=k;
                        Cannot[t].MineralCoordinate[Cannot[t].SumCoordinate].Vertical=i;
                        break;
                    }
                }
    for(int t=1;t<=n;t++)
        for(int Subscript=1;Subscript<=Cannot[t].SumCoordinate;Subscript++)
        {
            MarkHazard(Cannot[t].MineralCoordinate[Subscript].Vertical,
                       Cannot[t].MineralCoordinate[Subscript].Abscissa,
                       Cannot[t].MineralCoordinate[Subscript].Ordinate,
                       Cannot[t].DangerousDistances);
        }
    for(int i=1;i<=z;i++)
        for(int j=1;j<=x;j++)
            for(int k=1;k<=x;k++)
                for(int t=1;t<=m;t++)
                {
                    if(Moon[j][k][i]==Danger[t].DangerousMineral)
                    {
                        Superficie=1;Visit[j][k][i]=true;
                        FloodDfs(i,j,k,Moon[j][k][i]);
                        Danger[t].MineralGroup[++Danger[t].SumMineral]=Superficie;
                        break;
                    }
                }
    for(int t=1;t<=m;t++)
        sort(Danger[t].MineralGroup+1,Danger[t].MineralGroup+1+Danger[t].SumMineral);
    for(int i=1;i<=x;i++)
        for(int j=1;j<=x;j++)
            Nuclear[i][j]=Nuclear[i][j]&MoonNuclear[i][j][Highest[i][j]];
    VisitAns[1]=true;WdqerkDfs(1);
    WdqerkBfs();
    for(int t=1;t<=m;t++)
    {
        cout<<Danger[t].SumMineral<<' ';
        for(int i=1;i<=Danger[t].SumMineral;i++)
            cout<<Danger[t].MineralGroup[i]<<' ';
        cout<<endl;
    }
    return 0;
}
int SpaceManhattan(int x1,int y1,int z1,int x2,int y2,int z2)
{
    return abs(x1-x2)+abs(y1-y2)+abs(z1-z2);
}
void MarkHazard(int dx,int dy,int dz,int Distances)
{
    for(int i=1;i<=z;i++)
        for(int j=1;j<=x;j++)
            for(int k=1;k<=x;k++)
                if(SpaceManhattan(i,j,k,dx,dy,dz)<=Distances)
                    MoonNuclear[j][k][i]=false;
}
void FloodDfs(int X,int Y,int Z,int Flood)
{
    for(int i=0;i<26;i++)
    {
        int nX=X+Direction[i][0];
        int nY=Y+Direction[i][1];
        int nZ=Z+Direction[i][2];
        if(nX<0||nX>z||nY<0||nY>x||nZ<0||nZ>x||Visit[nY][nZ][nX]==true||Moon[nY][nZ][nX]!=Flood)
            continue;
        Superficie++;Visit[nY][nZ][nX]=true;
        FloodDfs(nX,nY,nZ,Flood);
    }
}
void WdqerkDfs(int Node)
{
    cout<<Node<<' ';
    for(int i=1;i<=x;i++)
    {
        if(Nuclear[Node][i]==true&&!VisitAns[i])
        {
            VisitAns[i]=true;
            WdqerkDfs(i);
        }
    }
}
void WdqerkBfs()
{
    cout<<endl<<1<<' ';
    memset(VisitAns,false,sizeof VisitAns);
    VisitAns[1]=true;
    queue<int>Queue;
    int NodeSum=1;
    Queue.push(1);
    while(!Queue.empty())
    {
        int Node=Queue.front();
        for(int i=1;i<=x;i++)
        {
            if(VisitAns[i]||Nuclear[Node][i]==0)
                continue;
            cout<<i<<' ';
            VisitAns[i]=true;
            Queue.push(i);
            NodeSum++;
            if(NodeSum==x)
                return;
        }
        Queue.pop();
    }
}

信息

ID
1001
难度
10
分类
(无)
标签
递交数
1
已通过
0
通过率
0%
上传者