USACO 4.4 Frame Up(拓扑排序)
2013-05-17 10:39
204 查看
终于结束了第4章。。倒数第二个题,卡了2个月。。。
![](http://images.cnitblog.com/blog/395897/201305/17104556-79adcfb9ab884245987695afa73ce951.jpg)
这个题,实现起来,还挺麻烦的,看懂题意,建好图,就是裸的拓扑排序了。
![](http://images.cnitblog.com/blog/395897/201305/17104556-79adcfb9ab884245987695afa73ce951.jpg)
这个题,实现起来,还挺麻烦的,看懂题意,建好图,就是裸的拓扑排序了。
/* ID:cuizhe LANG: C++ TASK: frameup */ #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <iostream> using namespace std; int lx[30],ly[30],rx[30],ry[30],flag[31],pre[31]; char str[101][101]; int p[30][30],o[30],key[30]; void dfs(int x,int step) { int i,z,j; pre[step] = x; z = 0; for(i = 0; i < 26; i ++) { if(!flag[i]&&o[i] == 0&&key[i]) { for(j = 0; j < 26; j ++) { if(p[i][j]) o[j] --; } flag[i] = 1; dfs(i,step+1); flag[i] = 0; for(j = 0; j < 26; j ++) { if(p[i][j]) o[j] ++; } z = 1; } } if(!z) { for(i = 1; i <= step; i ++) printf("%c",pre[i]+'A'); printf("\n"); return ; } } int main() { int n,m,i,j; freopen("frameup.in","r",stdin); freopen("frameup.out","w",stdout); scanf("%d%d",&n,&m); for(i = 0; i < 26; i ++) { lx[i] = 100000; ly[i] = 100000; rx[i] = -1; ry[i] = -1; } for(i = 0; i < n; i ++) { scanf("%s",str[i]); } for(i = 0; i < n; i ++) { for(j = 0; j < m; j ++) { if(str[i][j] != '.') { key[str[i][j]-'A'] = 1; lx[str[i][j]-'A'] = min(lx[str[i][j]-'A'],i); ly[str[i][j]-'A'] = min(ly[str[i][j]-'A'],j); rx[str[i][j]-'A'] = max(rx[str[i][j]-'A'],i); ry[str[i][j]-'A'] = max(ry[str[i][j]-'A'],j); } } } for(i = 0; i < 26; i ++) { if(key[i]) { for(j = lx[i]; j <= rx[i]; j ++) { if(str[j][ly[i]] != 'A' + i&&!p[i][str[j][ly[i]]-'A']) { p[i][str[j][ly[i]]-'A'] = 1; o[str[j][ly[i]]-'A'] ++; } } for(j = lx[i]; j <= rx[i]; j ++) { if(str[j][ry[i]] != 'A' + i&&!p[i][str[j][ry[i]]-'A']) { p[i][str[j][ry[i]]-'A'] = 1; o[str[j][ry[i]]-'A'] ++; } } for(j = ly[i]; j <= ry[i]; j ++) { if(str[lx[i]][j] != 'A' + i&&!p[i][str[lx[i]][j]-'A']) { p[i][str[lx[i]][j]-'A'] = 1; o[str[lx[i]][j]-'A'] ++; } } for(j = ly[i]; j <= ry[i]; j ++) { if(str[rx[i]][j] != 'A' + i&&!p[i][str[rx[i]][j]-'A']) { p[i][str[rx[i]][j]-'A'] = 1; o[str[rx[i]][j]-'A'] ++; } } } } for(i = 0; i < 26; i ++) { if(o[i] == 0&&key[i]) { flag[i] = 1; for(j = 0; j < 26; j ++) { if(p[i][j]) o[j] --; } dfs(i,1); for(j = 0; j < 26; j ++) { if(p[i][j]) o[j] ++; } flag[i] = 0; } } return 0; }
相关文章推荐
- usaco 4.4 Frame Up(拓扑排序)
- USACO 4.4 Frame Up (拓扑排序)
- Frame Up_usaco 4.4_拓扑排序
- usaco 4.4 Frame Up 2010.8.8
- USACO 4.4 Frame Up
- USACO 4.4 Shuttle Puzzle
- 关于拓扑排序的问题-P3116 [USACO15JAN]会议时间Meeting Time
- usaco4.4
- USACO4.4.3 Frame Up (frameup)
- USACO 4.4 Pollutant Control (milk6)
- usaco frame up(所有拓扑排序的输出)
- usaco 4.4 Shuttle Puzzle(字符hash+搜索)
- usaco 4.4 Shuttle Puzzle 2010.8.8
- usaco 4.4 Pollutant Control(最小割最少边数字典序最小)
- 【USACO4.4.3】重叠的图像(DAG图的拓扑排序)
- C++11——【USACO 4.4.3】——Frame Up
- USACO 4.4 Pollutant Control
- P1344 [USACO4.4] 追查坏牛奶Pollutant Control
- usaco 4.4 Shuttle Puzzle 找规律
- USACO 4.4 Pollutant Control (网络流求最小割割集)