本文主要是介绍AcWing 1250. 格子游戏(并查集),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
活动 - AcWing本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1252/
题解
当两个点已经是在同一个连通块中,再连一条边,就围成一个封闭的圈。一般用x * n + y的形式将(x, y)变成一维。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#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;
}
参考资料
- AcWing算法提高课
这篇关于AcWing 1250. 格子游戏(并查集)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!