题目的意思:给你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;
}