A Za, A Za, Fighting...

坚信:勤能补拙

PKU 1128 Frame Stacking

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1128

思路:
想法是有:先找出没有被任何其他frame覆盖的frame,然后将该frame进行标记,使之匹配任何字母,然后重复以上过程
不过,程序不知道该如何写

参考discuss以及其他人思路,发现可以用拓扑排序来做(拓扑排序,参考算法导论)
如何根据输入来建立邻接矩阵比较有意思,另外根据各个顶点的入度DFS实现拓扑排序

代码:
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define MAX_LEN 31
  5 #define MAX_NUM 27
  6 char map[MAX_LEN][MAX_LEN];
  7 int n, m;
  8 int adj[MAX_NUM][MAX_NUM], num, in[MAX_NUM], visited[MAX_NUM];
  9 int x1, y1, x2, y2;
 10 
 11 void
 12 search(char ch)
 13 {
 14     int i, j;
 15     x1 = y1 = MAX_LEN;
 16     x2 = y2 = -1;
 17     for(i=0; i<n; i++)
 18         for(j=0; j<m; j++)
 19             if(map[i][j] == ch) {
 20                 if(i<x1) x1 = i;
 21                 if(i>x2) x2 = i;
 22                 if(j<y1) y1 = j;
 23                 if(j>y2) y2 = j;
 24             }
 25 }
 26 
 27 void
 28 build_graph()
 29 {
 30     int i, j, k;
 31     char ch;
 32     num = 0;
 33     memset(adj, 0sizeof(adj));
 34     memset(in-1sizeof(in));
 35     for(i=0; i<n; i++) {
 36         for(j=0; j<m; j++) {
 37             if(map[i][j]=='.' || in[map[i][j]-'A']>-1)
 38                 continue;
 39             in[map[i][j]-'A'= 0;
 40             ++num;
 41             search(map[i][j]);
 42             for(k=x1; k<=x2; k++) {
 43                 ch = map[k][y1];
 44                 if(ch != map[i][j])
 45                     adj[map[i][j]-'A'][ch-'A'= 1;
 46             }
 47             for(k=x1; k<=x2; k++) {
 48                 ch = map[k][y2];
 49                 if(ch != map[i][j])
 50                     adj[map[i][j]-'A'][ch-'A'= 1;
 51             }
 52             for(k=y1; k<=y2; k++) {
 53                 ch = map[x1][k];
 54                 if(ch != map[i][j])
 55                     adj[map[i][j]-'A'][ch-'A'= 1;
 56             }
 57             for(k=y1; k<=y2; k++) {
 58                 ch = map[x2][k];
 59                 if(ch != map[i][j])
 60                     adj[map[i][j]-'A'][ch-'A'= 1;
 61             }
 62         }
 63     }
 64     for(i=0; i<MAX_NUM; i++)
 65         for(j=0; j<MAX_NUM; j++)
 66             if(adj[i][j])
 67                 ++in[j]; /* in-degree */
 68 }
 69 
 70 void
 71 topological_sort(char *str, int level)
 72 {
 73     int i, j;
 74     if(level == num) {
 75         printf("%s\n", str);
 76         return;
 77     }
 78     for(i=0; i<MAX_NUM; i++) {
 79         if(in[i]==0 && !visited[i]) {
 80             str[level] = 'A'+i;
 81             visited[i] = 1;
 82             for(j=0; j<MAX_NUM; j++)
 83                 if(adj[i][j])
 84                     --in[j];
 85             topological_sort(str, level+1);
 86             visited[i] = 0;
 87             for(j=0; j<MAX_NUM; j++)
 88                 if(adj[i][j])
 89                     ++in[j];
 90         }
 91     }
 92 }
 93 
 94 int
 95 main(int argc, char **argv)
 96 {
 97     int i;
 98     char str[MAX_NUM];
 99     while(scanf("%d %d"&n, &m)!=EOF) {
100         for(i=0; i<n; i++)
101             scanf("%s", map[i]);
102         build_graph();
103         memset(str, 0sizeof(str));
104         memset(visited, 0sizeof(visited));
105         topological_sort(str, 0);
106     }
107 }

posted on 2010-09-03 16:42 simplyzhao 阅读(250) 评论(0)  编辑 收藏 引用 所属分类: F_图算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜