1 solutions
-
0
Guest MOD
-
0
我们可以首先按照从值从大到小存储位置,利用队列模拟,如果和该点同行同列的点没有任何一个被炸过,也就是说本行本列没有被炸过的点,就选择这个点,否则选择下一个结点,最后输出所有没有没炸过的点,注意格式即可
#include<bits/stdc++.h> using namespace std; int n, m, k; int a[1005][1005]; bool r[1005], c[1005]; // 分别记录行和列是否被轰炸 struct node{ int val,x,y; }e[1000005]; bool cmp(node a,node b) { return a.val > b.val; } int main() { cin >> n >> m >> k; int cnt = 0; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ; j++) { cin >> a[i][j]; e[++cnt] = {a[i][j],i,j}; } } queue<pair<int,int> >q; sort(e+1,e+1+cnt,cmp); //cout<<cnt<<endl; for(int i = 1 ; i <= cnt ; i ++) { q.push({e[i].x,e[i].y}); } int sum = 0; while(!q.empty()) { int u = q.front().first; int v = q.front().second; q.pop(); if(r[u] || c[v]) continue; if(sum == k) break; sum++; r[u] = 1; c[v] = 1; } for(int i = 1 ; i <= n ; i++) { if(r[i]) continue; for(int j = 1 ; j <= m ; j++ ) { if(!c[j]) { cout<<a[i][j]<<" "; } } cout<<endl; } return 0; }
- 1
Information
- ID
- 1461
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 94
- Accepted
- 23
- Uploaded By