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 }

 

posted @ 2013-05-17 10:39  Naix_x  阅读(177)  评论(0编辑  收藏  举报