格子游戏

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

浙公网安备 33010602011771号