1 solutions

  • 0
    @ 2025-4-22 17:00:00

    我们可以首先按照从值从大到小存储位置,利用队列模拟,如果和该点同行同列的点没有任何一个被炸过,也就是说本行本列没有被炸过的点,就选择这个点,否则选择下一个结点,最后输出所有没有没炸过的点,注意格式即可

    #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