Optic Communication

/*

 *题目:Optic Communication

 *链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1008&cid=27417

 *题意:给出一些关键单词  VISIBLE A B  代表  A B 可以互相获取对方的发出的消息,OBSTACLE A B  与 WEATHER A B   都代表  A B 之间不能获取对方息,

MESSAGE A "HELLO" 代表 A  发出一条消息  "HELLO" ,特别需要注意的是消息中会含有空格,还有输出格式问题,比赛就挂了几次。最后按照 A-Z 的循序输出各自能接受到的消息。

 *思路:建双向图,进行BFS,不断添加 发出的信息。

*/

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
char aa2[30];
string a, a1, a2;
string s[26];
int G[30][30];
queue<int>Q;
void BFS(){
	int x;
	int vis[30][30];
	memset(vis, 0, sizeof vis);
	while (!Q.empty()){
		x = Q.front();
		Q.pop();
		for (int i = 0; i < 26; i++){
			if (i != x){
				if (G[x][i]&&vis[x][i] == 0){
					s[i].append(a2);
					Q.push(i);
					vis[i][x] = vis[x][i] = 1;
				}
			}
		}
	}
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--)
	{
		int n;
		scanf("%d", &n);
		memset(G, 0, sizeof G);
		getchar();
		for (int i = 0; i < 26; i++) s[i].clear();
		for (int i = 0; i < n; i++){
			cin >> a >> a1;
			getchar();gets(aa2);
			a2.clear();a2.append(aa2);
			if (a == "VISIBLE" || a == "OBSTACLE" || a == "WEATHER"){
				G[a1[0] - 'A'][a2[0] - 'A'] = !G[a1[0] - 'A'][a2[0] - 'A'];
				G[a2[0] - 'A'][a1[0] - 'A'] = !G[a2[0] - 'A'][a1[0] - 'A'];
			}
			else {
				while (!Q.empty())Q.pop();
				Q.push(a1[0] - 'A');
				BFS();
			}
		}
		for (int i = 0; i < 26; i++){
			if (!s[i].empty()) {
				printf("%c: [", 'A' + i);
				int l = s[i].length();
				int cnt = 0;
				for (int j = 0; j < l; j++){
					printf("%c", s[i][j]);
					if (s[i][j] == '\"') cnt++;
					if (cnt % 2 == 0 && j != l - 1)printf(", ");
				}
				printf("]\n");
			}
		}
		if (T>0) printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值