Topology Sorting: the edge is marked as a vertex and the square is an edge. When a directed ring exists in the topology, unbounded; otherwise, bounded;
Note: carefully process the input;
When traversing a vertex, the next side of the vertex is traversed. That is, when traversing to A +, the next traversal starts from;
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int n; 7 int g[60][60]; 8 int visit[60]; 9 10 int dfs (int u){11 visit[u]=-1;12 if (u%2)13 u--;14 else u++;15 for (int i=0;i<52;i++)16 if (g[u][i]){17 if (visit[i]<0)18 return false ;19 else if (!visit[i]&&!dfs (i))20 return false ;21 }22 if (u%2) u--;else u++;23 visit[u]=1;24 return true ;25 }26 27 int topo (){28 for (int u=0;u<52;u++)29 if (!visit[u]&&!dfs (u))30 return false ;31 return true ;32 }33 34 int main (){35 while (~scanf ("%d",&n)){36 memset (visit,0,sizeof visit);37 memset (g,0,sizeof g);38 for (int i=0;i<n;i++){39 char s[10];40 scanf ("%s",s);41 for (int j=0;j<4;j++){42 if (s[j*2]==‘0‘)43 continue ;44 int tempj=(s[j*2]-‘A‘)*2;45 //g[tempj][tempj+1]=g[tempj+1][tempj]=1;46 tempj+=s[j*2+1]==‘+‘?0:1;47 for (int o=j+1;o<4;o++){48 if (s[o*2]==‘0‘)49 continue ;50 int tempo=(s[o*2]-‘A‘)*2;51 tempo+=s[o*2+1]==‘+‘?0:1;52 g[tempj][tempo]=g[tempo][tempj]=1;53 }54 }55 }56 //for (int i=0;i<52;i++){for (int j=0;j<52;j++){cout<<g[i][j];}cout<<endl;}57 if (topo ())58 printf ("bounded\n");59 else printf ("unbounded\n");60 }61 return 0;62 }