zoukankan      html  css  js  c++  java
  • acwing 1250. 格子游戏 并查集

    地址 https://www.acwing.com/problem/content/1252/

    Alice和Bob玩了一个古老的游戏:首先画一个 n×nn×n 的点阵(下图 n=3n=3 )。

    接着,他们两个轮流在相邻的点之间画上红边和蓝边:

     

    直到围成一个封闭的圈(面积不必为 11)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了,他们的游戏实在是太长了!

    他们甚至在游戏中都不知道谁赢得了游戏。

    于是请你写一个程序,帮助他们计算他们是否结束了游戏?

    输入格式

    输入数据第一行为两个整数 nn 和 mm。nn表示点阵的大小,mm 表示一共画了 mm 条线。

    以后 mm 行,每行首先有两个数字 (x,y)(x,y),代表了画线的起点坐标,接着用空格隔开一个字符,假如字符是 DD,则是向下连一条边,如果是 RR 就是向右连一条边。

    输入数据不会有重复的边且保证正确。

    输出格式

    输出一行:在第几步的时候结束。

    假如 mm 步之后也没有结束,则输出一行“draw”。

    数据范围

    1n2001≤n≤200,
    1m24000

    输入样例:
    3 5
    1 1 D
    1 1 R
    1 2 D
    2 1 R
    2 2 D
    输出样例:
    4

    解法 

    最开始看成查找最后围成1个正方形的格子 使用哈希记录之前的操作 。当然是错误了。

    该题目使用并查集  记录两个点是否属于同一个集合 如果连线的两点属于同一个集合 那么这次的连线就能连成一个封闭的圈

    注意 二维数组转换成一维方便并查集记录时候的边界

    代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <string>
     6 
     7 using namespace std;
     8 
     9 int n, m;
    10 
    11 const int N = 40010;
    12 
    13 int p[N];
    14 
    15 int find(int x)
    16 {
    17     if (x != p[x])  p[x] = find(p[x]);
    18 
    19     return p[x];
    20 }
    21 
    22 int get(int x,int y)
    23 {
    24     return x * n + y;
    25 }
    26 
    27 int main()
    28 {
    29     cin >> n >> m;
    30     for (int i = 0; i < n * n; i++) p[i] = i;
    31 
    32     int res = 0;
    33     for (int i = 1; i <= m; i++) {
    34         int x, y; string s;
    35         cin >> x >> y >> s;
    36         x--, y--;
    37         int b;
    38         if (s == "D") {
    39             b = get(x + 1, y);
    40         }
    41         else {
    42             b = get(x, y + 1);
    43         }
    44 
    45         int pa = find(x), pb = find(x);
    46         if (pa == pb){
    47             res = i; break;
    48         }
    49     }
    50 
    51     if (res != 0) puts("draw");
    52     else cout << res << endl;
    53 
    54     return 0;
    55 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    再见,我的二零一七
    Tomcat 源码分析(二)——Request处理全过程
    帅案之上——作为开发者的远见与卓识
    Tomcat 源码分析(一)——启动与生命周期组件
    从代码质量谈起
    Java设计模式(四)——再谈观察者模式
    你所不了解的五条面试忠告
    见微知著——从自定义类型的operator==说起
    编码、散列与加解密
    数据结构与算法(c++)——双缓存队列
  • 原文地址:https://www.cnblogs.com/itdef/p/12149106.html
Copyright © 2011-2022 走看看