社区讨论

1

UVA10129单词 Play on Words参与者 6已保存回复 25

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
25 条
当前快照
1 份
快照标识符
@m440v2z9
此快照首次捕获于
2024/11/30 18:20
去年
此快照最后确认于
2024/11/30 20:31
去年
查看原帖
存个代码
CPP
#include <iostream>
using namespace std;
int n, T, val;
int din[100005], dout[100005];
int p[30];
bool f, ok[30];
int find(int x)
{
	if(x != p[x])
		p[x] = find(p[x]);
	return p[x];
} 
int main()
{
	//cin.tie(0);
	cin >> T;
	while(T--)
	{
		f = 0;
		for(int i = 0;i <= 29; i++)
		{
			ok[i] = din[i] = dout[i] = 0;
			p[i] = i;
		}
		// 输入数据 
		cin >> n;
		for(int i = 1;i <= n; i++)
		{
			string str;
			cin >> str;
			int u, v;
			u = str[0] - 'a' + 1;
			v = str[str.size() - 1] - 'a' + 1;
			dout[u]++;
			din[v]++;
			ok[u] = ok[v] = 1;
			p[find(u)] = find(v);
		}
		// 处理数据
		int curp = -1;
		for(int i = 1;i <= 26; i++)
		{
			if(ok[i])
			{
				if(curp == -1)
				{
					curp = find(i);
				}
				else if(find(i) != curp)
				{
					printf("The door cannot be opened.\n");
					f = 1;
					break;
				}
			}
		}
		if(f)
			continue;
		// 判断 
		int ans1 = 0,ans2 = 0;
		
		for(int i = 1;i <= 26; i++)
		{
			if(din[i] != dout[i])
			{
				if(abs(din[i] - dout[i]) == 1)
				{
					if(din[i] - dout[i] == 1)
						ans1++;
					else ans2++;
					if(ans1 > 1 || ans2 > 1)
					{
						printf("The door cannot be opened.\n");
						f = 1;
						break;
					}
						
				}else{
					printf("The door cannot be opened.\n");
					f = 1;
					break;
				}
			}
		} 
		if(f) 
			continue;
		if((ans1 == 1 && ans2 == 1) || (ans1 == 0 && ans2 == 0))
		{
			printf("Ordering is possible.\n");
		}
		else{
			printf("The door cannot be opened.\n");
		}
	}
	return 0;
}

回复

25 条回复,欢迎继续交流。

正在加载回复...