L1-112 现代战争(分数20)

题目描述

王牌飞行员 佐巴杨 最近迷上了一款游戏,在游戏里他驾驶战斗机,对一座地图进行轰炸,地图由n×m个小方格组成,每个方格有个城市,其价值为w。

佐巴杨很聪明,他知道自己每次要轰炸价值最高的城市,而这个炸弹会将这座城市所在行与列上的城市全部轰炸,每次轰炸,地图会自动更新为(n-1)× (m-1)的地图。佐巴杨会经历k次轰炸。

输入格式

第一行给出n,m( \(2\) \(\le\) \(n,m\) \(\le\) \(1000\) ) ,k( k \(<\) min{m,n} )
接着给出n×m的地图。

输出格式

输出最后的地图

解题思路

显然需要一个 row数组 和 col数组 来记录每一行和每一列的情况 ,还需要在每次轰炸前找到价值最大的城市且要清楚他的行号与列号 ,并改变bool数组状态;
如果每次遍历,太慢,如果转换为一维数组,下标映射太麻烦 ; 那不如用一个 结构体 ,因为结构体可以使得价值与行号,列号绑定。

用结构体储存val,col,row;并排序,轰炸时,令bool[struct[i].row(col)] = true;

最后
遍历初始地图,如果这一行或者这一列被标记 , 不输出,否则输出。

ac✅️代码

#include<iostream>
#include<algorithm>
using namespace std;

struct M {
    int val;
    int row;
    int col;
    bool operator< (const M &s) const {
        return val > s.val; 
    }
} member[1000005]; 

int mp[1010][1010];
bool r[1010], c[1010];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m, t;
    if (!(cin >> n >> m >> t)) return 0;

    int st = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> mp[i][j];
            member[st].val = mp[i][j];
            member[st].row = i;
            member[st].col = j;
            st++;
        }
    }

    sort(member, member + st);

    for (int i = 0; i < st; i++) {
        if (t == 0) break;
        if (!r[member[i].row] && !c[member[i].col]) {
            r[member[i].row] = true;
            c[member[i].col] = true;
            t--;
        }
    }

    for (int i = 0; i < n; i++) {
        if (r[i]) continue;
        bool first = true;
        for (int j = 0; j < m; j++) {
            if (c[j]) continue;
            if (!first) cout << " ";
            cout << mp[i][j];
            first = false;
        }
        cout << endl;
    }
    return 0;
}

佐巴杨的游戏生活圆满了,但人总要面对生活

posted @ 2026-03-13 21:51  shuiwangrenjia  阅读(2)  评论(0)    收藏  举报