L1-8 现代战争

在最新的《命运召唤:现代战争》中,你要扮演 B 国的一名战斗机飞行员,前往轰炸 A 国的高价值建筑。A 国的建筑群可视为一个由 n×m 个小方格组成的地图,每个小方格中有一幢建筑,并且你已经知道了所有建筑的价值。
作为一名优秀的战斗机飞行员,你打算轰炸 k 幢建筑,轰炸方式是:你选择当前所有还存在的建筑里最高价值的一幢投下炸弹,这个炸弹会将这个建筑所在的一整行和一整列都炸平。。随后系统将彻底抹除被炸平的建筑,将剩下的地块合并成 (n−1)×(m−1) 的地图。

例如对原始地图

1 2 3
7 9 8
6 5 4

进行一次轰炸后,更新后的地图为:

1 3
6 4

请你编写程序,输出你轰炸了 k 幢建筑后的地图。

注:游戏纯属虚构,如有雷同纯属巧合

输入格式:
输入第一行给出三个正整数 n、m(2≤n,m≤1000)和 k(<min{n,m}),依次对应地图中建筑的行数、列数,以及轰炸步数。随后 n 行,每行 m 个整数,为地图中对应建筑的价值。
题目保证所有元素在 [−230,230] 区间内,且互不相等。同行数字间以空格分隔。

输出格式:
输出轰炸 k 幢建筑后的地图。同行数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:


4 5 2
3 8 6 1 10
28 9 21 37 5
4 11 7 25 18
15 23 2 17 14

输出样例:


3 6 10
4 7 18

代码

#include<bits/stdc++.h>
using namespace std;
// 标记行和列是否已被炸
int x[1010],y[1010];
// 存储建筑价值的二维数组
int a[1010][1010];
// 优先队列,按价值降序存建筑信息
priority_queue<array<int,3>> p;
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    // 读入建筑价值并加入优先队列
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            p.push({a[i][j],i,j});
        }
    // 进行k次轰炸
    while(k--)
    {
        auto q=p.top();
        // 若建筑所在行或列已被炸,换一个
        while(x[q[1]]||y[q[2]])
        {
            p.pop();
            q=p.top();
        }
        // 标记该行和列已被炸
        x[q[1]]=y[q[2]]=1;
    }
    // 输出剩余建筑价值
    for(int i=1;i<=n;i++)
    {
        if(x[i])
            continue;
        int o=0;
        for(int j=1;j<=m;j++)
        {
            if(y[j])
                continue;
            if(o==0)
            {
                cout<<a[i][j];
                o=1;
            }
            else
                cout<<" "<<a[i][j];
        }
        cout<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值