并查集1:格子游戏

简介: 并查集

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

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

1.png

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

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

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

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

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

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

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

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

数据范围
1≤n≤200,
1≤m≤24000
输入样例:
3 5
1 1 D
1 1 R
1 2 D
2 1 R
2 2 D
输出样例:
4

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
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()
{
    scanf("%d %d", &n, &m);
    for(int i=1;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 printf("%d\n", res);
    return 0;
}
相关文章
【动态规划刷题 5】 最小路径和&&地下城游戏
【动态规划刷题 5】 最小路径和&&地下城游戏
|
28天前
lanqiaoOJ 211 剪格子
lanqiaoOJ 211 剪格子
12 3
|
29天前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
26 0
|
6月前
|
Java 索引
leetcode-45:跳跃游戏 II
leetcode-45:跳跃游戏 II
44 0
|
机器学习/深度学习
1347:【例4-8】格子游戏
1347:【例4-8】格子游戏
121 0
LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)
LeetCode动态规划—跳跃游戏从跳到头到跳最少下跳到头(45、55)
|
算法 开发工具 索引
宝石方块游戏中三消查找算法的原理和实现
嗨!大家好,我是小蚂蚁。 今天这篇文章分享一下三消查找算法的原理和实现,其实三消的机制最早源于《宝石方块》这款经典游戏,如今三消已经属于一个游戏品类了。 最近刚好正在制作一款宝石方块游戏,顺便讲一下其中的三消查找算法。一直以为之前写过了,找了一圈发现并没有,今天就在这里补上。
335 0
AcWing——方格迷宫(有点不一样的迷宫问题)
AcWing——方格迷宫(有点不一样的迷宫问题)
89 0