USACO 4.4 Frame Up(拓扑排序)
终于结束了第4章。。倒数第二个题,卡了2个月。。。
这个题,实现起来,还挺麻烦的,看懂题意,建好图,就是裸的拓扑排序了。
1 /* 2 ID:cuizhe 3 LANG: C++ 4 TASK: frameup 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <queue> 10 #include <iostream> 11 using namespace std; 12 int lx[30],ly[30],rx[30],ry[30],flag[31],pre[31]; 13 char str[101][101]; 14 int p[30][30],o[30],key[30]; 15 void dfs(int x,int step) 16 { 17 int i,z,j; 18 19 pre[step] = x; 20 z = 0; 21 for(i = 0; i < 26; i ++) 22 { 23 if(!flag[i]&&o[i] == 0&&key[i]) 24 { 25 for(j = 0; j < 26; j ++) 26 { 27 if(p[i][j]) 28 o[j] --; 29 } 30 flag[i] = 1; 31 dfs(i,step+1); 32 flag[i] = 0; 33 for(j = 0; j < 26; j ++) 34 { 35 if(p[i][j]) 36 o[j] ++; 37 } 38 z = 1; 39 } 40 } 41 if(!z) 42 { 43 for(i = 1; i <= step; i ++) 44 printf("%c",pre[i]+'A'); 45 printf("\n"); 46 return ; 47 } 48 } 49 int main() 50 { 51 int n,m,i,j; 52 freopen("frameup.in","r",stdin); 53 freopen("frameup.out","w",stdout); 54 scanf("%d%d",&n,&m); 55 for(i = 0; i < 26; i ++) 56 { 57 lx[i] = 100000; 58 ly[i] = 100000; 59 rx[i] = -1; 60 ry[i] = -1; 61 } 62 for(i = 0; i < n; i ++) 63 { 64 scanf("%s",str[i]); 65 } 66 for(i = 0; i < n; i ++) 67 { 68 for(j = 0; j < m; j ++) 69 { 70 71 if(str[i][j] != '.') 72 { 73 key[str[i][j]-'A'] = 1; 74 lx[str[i][j]-'A'] = min(lx[str[i][j]-'A'],i); 75 ly[str[i][j]-'A'] = min(ly[str[i][j]-'A'],j); 76 rx[str[i][j]-'A'] = max(rx[str[i][j]-'A'],i); 77 ry[str[i][j]-'A'] = max(ry[str[i][j]-'A'],j); 78 } 79 } 80 } 81 for(i = 0; i < 26; i ++) 82 { 83 if(key[i]) 84 { 85 for(j = lx[i]; j <= rx[i]; j ++) 86 { 87 if(str[j][ly[i]] != 'A' + i&&!p[i][str[j][ly[i]]-'A']) 88 { 89 p[i][str[j][ly[i]]-'A'] = 1; 90 o[str[j][ly[i]]-'A'] ++; 91 } 92 } 93 for(j = lx[i]; j <= rx[i]; j ++) 94 { 95 if(str[j][ry[i]] != 'A' + i&&!p[i][str[j][ry[i]]-'A']) 96 { 97 p[i][str[j][ry[i]]-'A'] = 1; 98 o[str[j][ry[i]]-'A'] ++; 99 } 100 } 101 for(j = ly[i]; j <= ry[i]; j ++) 102 { 103 if(str[lx[i]][j] != 'A' + i&&!p[i][str[lx[i]][j]-'A']) 104 { 105 p[i][str[lx[i]][j]-'A'] = 1; 106 o[str[lx[i]][j]-'A'] ++; 107 } 108 } 109 for(j = ly[i]; j <= ry[i]; j ++) 110 { 111 if(str[rx[i]][j] != 'A' + i&&!p[i][str[rx[i]][j]-'A']) 112 { 113 p[i][str[rx[i]][j]-'A'] = 1; 114 o[str[rx[i]][j]-'A'] ++; 115 } 116 } 117 } 118 } 119 for(i = 0; i < 26; i ++) 120 { 121 if(o[i] == 0&&key[i]) 122 { 123 flag[i] = 1; 124 for(j = 0; j < 26; j ++) 125 { 126 if(p[i][j]) 127 o[j] --; 128 } 129 dfs(i,1); 130 for(j = 0; j < 26; j ++) 131 { 132 if(p[i][j]) 133 o[j] ++; 134 } 135 flag[i] = 0; 136 } 137 } 138 return 0; 139 }