算法提高--数据结构--并查集例题(1)

算法提高–数据结构–并查集例题–格子游戏

题目描述:

Bob和Alice玩游戏,两人分别在一个方格纸上延边画线,当画出封闭矩形时结束游戏。问什么时候结束游戏。

输入:

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

输出:

第几局结束游戏

数据范围:

1≤n≤200,
1≤m≤24000。

做题思路:

两个点连边,可以看成将两个点加入一个集合。游戏持续过程中,如果发现两个点已经在同一个集合了,说明这几个点可以构成一个矩形,输出局数即可。

AC代码:

#include
#include
#include

using namespace std;

const int N = 40010;

int n, m;
int p[N];

int find(int x)
{
	if(x == p[x]) return x;
	return p[x] = find(p[x]);
}

int main()
{
	scanf("%d%d", &n, &m);
	
	//初始化并查集 
	for(int i = 1; i <= n; i ++ )
		for(int j = 1; j <= n; j ++ )
			p[i * n + j] = i * n + j;
	
	int flag = 1;
	for(int i = 1; i <= m; i ++ )
	{
		int x, y, x1, y1, pa, pb;
		char s[2];
		cin >> x >> y >> s;
		if(s[0] == 'D')
			x1 = x + 1, y1 = y;
		else
			x1 = x, y1 = y + 1;
		pa = find(x * n + y);
		pb = find(x1 * n + y1);
		if(pa != pb) p[pa] = pb;
		else
		{
			cout << i << endl;
			flag = 0;
			break;
		}
	}
	if(flag)
		cout << "draw" << endl; 
	return 0;
} 

你可能感兴趣的:(数据结构,数据结构)