94 移除最多的同行或同列石头

作者: Turbo时间限制: 1S章节: 其它

晚于: 2020-09-09 12:00:00后提交分数乘系数50%

问题描述 :

我们将石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。

每次 move 操作都会移除一块所在行或者列上有其他石头存在的石头。

请你设计一个算法,计算最多能执行多少次 move 操作?

示例 1:

输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]

输出:5

示例 2:

输入:stones = [[0,0],[0,2],[1,1],[2,0],[2,2]]

输出:3

示例 3:

输入:stones = [[0,0]]

输出:0

输入说明 :

首先输入石头的数量n,

然后输入n行,每行一个坐标x、y,x和y之间以空格分隔。

1 <= n <= 1000

0 <= x,y < 10000

输出说明 :

输出一个整数

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

//同一行或同一列有其他石头才能移除 
class Solution {
public:
    int f[20000];
    unordered_set<int> list;
    int removeStones(vector<vector<int>>& stones) 
    {
        for(int i=0;i<20000;i++)
            f[i]=i;
        for(int i=0;i<stones.size();i++)
            union_ij(stones[i][0],stones[i][1]+10000);
        for(int i=0;i<stones.size();i++)
        {
        //    cout<<"insert:"<<" "<<find(stones[i][0]);
            list.insert(find(stones[i][0]));
        }
        return stones.size()-list.size();
    }
    int find(int x)
    {
        if(x!=f[x])
            return f[x]=find(f[x]);
        else
            return x;
    }

    void union_ij(int x,int y)
    {
        int fx=find(x);
        int fy=find(y);
       // cout<<"x:"<<" "<<fx<<endl;
       // cout<<"y:"<<" "<<fy<<endl;
        if(fx!=fy)
            f[fx]=fy;
    }
};


int main()
{
    int n,temp;
    cin>>n;
    vector<vector<int>> stones;
    
    for(int i=0;i<n;i++)
    {
        vector<int> row;
        for(int j=0;j<2;j++)
        {
            cin>>temp;
            row.push_back(temp);
        }
        stones.push_back(row);
    }
    int res=Solution().removeStones(stones);
    cout<<res;
} 
原文地址:https://www.cnblogs.com/zmmm/p/13675511.html