您的位置:首页 > 其它

Uva1572——Self-Assembly

2016-03-05 09:14 369 查看
题目的意思:给你N个正方形,正方形每条边有编号,为一个大写字母加上一个“+”或者“-”,还有一个编号是“00”,“00”边不能连接其他的正方形,而想要连接需要字母相同,符号相反,问能不能无限的铺。

下面是代码,有解析。主要是dfs来判断是否存在环。

代码:

#include <iostream>
#include <cstring>
using namespace std;

int c[55];
int G[55][55];      //前面26个是 代表 + 的,后面26个代表 - 的

void link(char a1, char b1, char a2, char b2)      //边的连接
{                                                  //由于相同的字母,符号不同的可以相连
if(a1 == '0' || a2 == '0')
return;
int a, b;
if(b1 == '+')                             //所以将 + 符号的 转换成 -  的,相当于是连接的,这步很关键
a = a1 - 'A' + 26;
else if(b1 == '-')
a = a1 - 'A';

if(b2 == '+')
b = a2 - 'A';
else if(b2 == '-')
b = a2 - 'A' + 26;
G[a][b] = 1;
}

bool dfs(int u)          //深搜判断是否有环
{
c[u] = -1;
for(int v = 0; v < 52; v++)
{
if(G[u][v])
{
if(c[v] < 0)
return true;
else if(!c[v] && dfs(v))
return true;
}
}
c[u] = 1;
return false;
}

bool fun()
{
memset(c, 0, sizeof(c));
for(int u = 0; u < 52; u++)
{
if(!c[u])
{
if(dfs(u))
return true;
}
}
return false;
}

int main()
{
//	freopen("1.txt", "r", stdin);
int n;
char str[20];
while(cin >> n)
{
memset(G, 0, sizeof(G));
while(n--)
{
cin >> str;
for(int i = 0; i < 8; i += 2)
{
for(int j = 0; j < 8; j +=2)
{
if(i != j)   //对每个正方形都进行字母的连接
{
link(str[i], str[i + 1], str[j], str[j + 1]);
}
}
}
}
if(!fun())
cout << "bounded" << endl;
else
cout << "unbounded" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: