AcWing 1250. 格子游戏(并查集)

题目描述

题目链接

题目思路

  • 如果两个点连边之前在一个集合里,那么连边后就构成一个环
  • 如果两个点连边之前不在一个集合里,那么连边后就不构成一个环
  • 从前往后合并,直到第一次出现环为止
  • 把二维坐标转化为一维坐标,(x,y)==> x × n + y, xy坐标都从0开始

题目代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 40010;

int n, m;
int p[N];

int get(int x, int y)
{
    return x * n + y;
}

int find(int x)
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    cin >> n >> m;
    
    for(int i = 0; i < n * n; i ++ ) p[i] = i;
    
    int res = 0;
    for(int i = 1; i <= m; i ++ )
    {
        int x, y;
        char d;
        cin >> x >> y >> d;
        x --, y --;
        int a = get(x, y);
        int b;
        if(d == 'D') b = get(x + 1, y);
        else b = get(x, y + 1);
        
        int pa = find(a), pb = find(b);
        if(pa == pb)
        {
            res = i;
            break;
        }
        p[pa] = pb;
    }
    
    if(!res) puts("draw");
    else cout << res << endl;
    
    return 0;
}
posted @   esico  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示