将正方形视为连接字符间的边。比方说正方形上存在A+,B-,就从A-往B+连边,表示字符可以通过这个正方形进行变换。
如果能构成环的话就可以无穷大了。。。判环随便写个拓扑什么的...
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define d double
using namespace std;
bool mp[][];
int dl[],rd[];;
int i,j,k,n,m,l,r;
char s[]; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
}
int main(){
n=read();int a[];
for(i=;i<=n;i++){
scanf("%s",s+);
for(j=;j<=;j++)if(s[j<<]!='')
a[j]=(s[j*-]-'A'+)*+(s[j<<]=='-');else a[j]=-;
// for(j=1;j<=4;j++)printf(" %d",a[j]);puts("");
for(j=;j<;j++)if(a[j]>)for(k=j+;k<=;k++)if(a[k]>)
// printf(" %d-->%d\n %d-->%d\n",a[j]^1,a[k],a[k]^1,a[j]),
mp[a[j]^][a[k]]=mp[a[k]^][a[j]]=;
// printf("(%d)",i);
}
for(i=;i<=;i++){
for(j=;j<=;j++)if(mp[j][i])rd[i]++;
if(!rd[i])dl[++r]=i;
}
while(l<r)
for(int now=dl[++l],i=;i<=;i++)if(mp[now][i]&&!--rd[i])
dl[++r]=i;
if(r==)puts("bounded");else puts("unbounded");
}