USACO 4.4 Frame Up(拓扑排序)

终于结束了第4章。。倒数第二个题,卡了2个月。。。

USACO 4.4 Frame Up(拓扑排序)

 

这个题,实现起来,还挺麻烦的,看懂题意,建好图,就是裸的拓扑排序了。

  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 }

 

你可能感兴趣的:(USACO)