这题什么都不考
这题考的就是抽象能力,能否从中抽象出一个图论模型来,对思维的要求非常的高
同时也再次使用了dfs判断是否有圈
下面贴出代码:
//这题的关键就是:什么情况就是unbounded //如果连接过的点,可以再次重复出现,那么就是unbounded #include<cstdio> #include<string> #include<cstring> #include<iostream> using namespace std; int vis[52]; int G[52][52]; void draw_eg(char a,char b,char c,char d) { if(a == '0' || c == '0') return; G[2 * (a - 'A') + !(b == '+' ? 0:1)][2 * (c - 'A') + (d == '+' ? 0:1)] = 1; } bool dfs(int x) { vis[x] = -1; for(int i = 0;i < 52;i++) { if(G[x][i]) { if(vis[i] == -1) return false; if(!vis[i]) if(!dfs(i)) return false; } } vis[x] = 1; return true; } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out.txt","w",stdout); #endif int num_squ; while(scanf("%d",&num_squ) == 1&& num_squ) { memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); char s[10]; for(int i_0 = 0;i_0 < num_squ;i_0++) { scanf("%s",s); for(int i_1 = 0;i_1 < 4;i_1++) { for(int i_2 = 0;i_2 < 4;i_2++) { if(i_1 != i_2) { draw_eg(s[2 * i_1],s[2 * i_1 + 1],s[2 * i_2],s[2 * i_2 + 1]); } } } } //只需要判断是否有圈就可以了 bool flag = 0; for(int j = 0;j < 52;j++) { if(!vis[j]) if(!dfs(j)) { flag = 1; break; } } if(flag) printf("unbounded\n"); else printf("bounded\n"); } return 0; }
转载于:https://www.cnblogs.com/TorettoRui/p/10456944.html