Loading

格子游戏

 

发现如果连接两个点的时候这两个点已经在同一个集合里了,那么说明这条边一定是形成回路的一条边。。。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = 400010;
 5 int p[N];
 6 int n, q;
 7 
 8 int get(int a, int b) {
 9     return a * n + b;
10 }
11 int find(int x) {
12     if (p[x] != x) p[x] = find(p[x]);
13     return p[x];
14 }
15 
16 int main() {
17     cin >> n >> q;
18     for (int i = 0;i < n * n;i ++) 
19         p[i] = i;
20     int res = 0;
21     for (int i = 1;i <= q;i ++) {
22         int x, y;
23         char o;
24         cin >> x >> y >> o;
25         x --, y --;
26         int a = get(x, y);
27         int b = 0;
28         if (o == 'D') 
29             b = get(x + 1, y);
30         else 
31             b = get(x, y + 1);
32         int s = find(a), v = find(b);
33         if (s == v) { 
34             res = i;
35             cout << res << endl;
36             break;
37         } else 
38             p[s] = v;
39     }
40     if (!res) cout << "draw" << endl;
41     return 0;
42 }

一开始想到了一个点如果被经历两次那么一定是回路,想的太简单了而且不知道如何实现,同时这个题还有一个小技巧就是把二维坐标映射为一维坐标(x和y从0开始)a = x * n + y。

posted @ 2023-02-11 14:30  KakaDBL  阅读(86)  评论(0)    收藏  举报