紫书刷题 UVA1572 自组合(Self-Assembly)

UVA1572

一道有向图的简单题。难的是有向图模型的提取。题目原文
核心思路就是,将正方形的每一个边看做结点,每一个正方形看成通路(边)。

输入样例:
3
A+00A+A+ 00B+D+A- B-C+00C+
1
K+K-Q+Q
输出样例:
bounded
unbounded
注意事项:

注意一下下面代码中solve函数和dfs函数中的逻辑关系就行,没有什么特别的。

代码:
#include <cstdio>
#include <cstring>

int g[52][52];
int c[52];

int ID(char a, char b)
{
	if (b == '+') return (a - 'A') * 2;
	if (b == '-') return (a - 'A') * 2 + 1;
}

void connect(char a1, char a2, char b1, char b2)
{
	int u = ID(a1, a2) ^ 1;
	int v = ID(b1, b2);
	g[u][v] = 1;
}

//正在-1 已经1 未0
bool dfs(int n)
{
	c[n] = -1;
	for (int i = 0; i < 52; i++) {
		if (g[n][i]) {
			if (c[i] == -1) return true;
			if (c[i] == 0 && dfs(i)) return true;
		}
	}
	c[n] = 1;
	return false;
}

bool solve()
{
	memset(c, 0, sizeof(c));
	for (int i = 0; i < 52; i++) {
		if (c[i] == 0) {
			if (dfs(i)) return true;
		}

	}
	return false;
}

int main()
{
#ifdef LOCAL
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif

	int n;
	while (scanf("%d", &n) == 1 && n) 
	{
		memset(g, 0, sizeof(g));
		while (n--) {
			char s[20];
			scanf("%s", s);
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					if (i != j && s[2*i]!='0' && s[2*j] != '0') {
						connect(s[2 * i], s[2 * i + 1], s[2 * j], s[2 * j + 1]);
					}
				}
			}
		}

		if (solve()) puts("unbounded");
		else puts("bounded");
	}
	
	return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FengLing255

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值