zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    论文摘记 2017.4.6-4.9
    P4 PI库安装
    Markdown中的表格
    Easy install ryu
    《重构网络-SDN架构与实现》阅读随笔
    解决Github Desktop Repo publish 失败问题
    解决 "OperationalError: (sqlite3.OperationalError) no such table: ..."问题
    初始化 Flask 虚拟环境 命令
    Flask: socket.error: [Errno 48] Address already in use 问题
    【转】TCP端口号记录
  • 原文地址:https://www.cnblogs.com/zmmm/p/13675511.html
Copyright © 2011-2022 走看看