码迷,mamicode.com
首页 > 其他好文 > 详细

重写POJ1128

时间:2015-06-25 22:48:18      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

构图+拓扑排序。

虽然是第二次写,但是感觉自己还是很不熟。

求所有拓扑序列的时候,用DFS即可,代码不是很长,但是我却傻瓜的没有注意到入度要先置为0这件事情。

其实最浪费时间的是构图,这花了我很长时间。

最好的方法就像上一次做的时候所言,还是要拆分成一个个函数去做,init要写,其他不方便实现的过程可以先用函数代替,当写完了这一个阶段之后,再去完善。

AND 我用G++编译器说我过不了,但是C++可以,原因在于POJ的G++如果不加载cstdio库 就不能 直接使用max和min。其实最好还是手打宏,下次可以试试。

  1 /************************
  2     Accepeted
  3     712KB
  4     16MS
  5     2015-06-25
  6     JimmyLin
  7 ************************/
  8 #include<iostream>
  9 #include<cstdio>
 10 #include<cstring>
 11 
 12 using namespace std;
 13 const int maxn=35;
 14 char a[maxn][maxn];
 15 char ans[maxn];
 16 int h,w;
 17 int c(char c)
 18 {
 19     return c-A;
 20 }
 21 char max_alpha;
 22 int deg[maxn];
 23 bool b[maxn][maxn];
 24 int l[maxn],r[maxn],t[maxn],d[maxn];
 25 void init()
 26 {
 27     max_alpha=.;
 28     memset(a,0,sizeof(a));
 29     memset(ans,0,sizeof(ans));
 30     memset(deg,-1,sizeof(deg));
 31     memset(b,0,sizeof(b));
 32     memset(l,0x3f,sizeof(l));
 33     memset(r,-1,sizeof(r));
 34     memset(t,0x3f,sizeof(t));
 35     memset(d,-1,sizeof(d));
 36     
 37     for(int i=1;i<=h;i++)
 38         for(int j=1;j<=w;j++){
 39             cin>>a[i][j];
 40             max_alpha=max(max_alpha,a[i][j]);
 41         } 
 42 }
 43 void build()
 44 {
 45     for(int i=1;i<=h;i++)
 46          for(int j=1;j<=w;j++){
 47              int x=c(a[i][j]);
 48              l[x]=min(l[x],j);
 49              r[x]=max(r[x],j);
 50              t[x]=min(t[x],i);
 51              d[x]=max(d[x],i);
 52          }
 53     for(char k=A;k<=max_alpha;k++){
 54         int x=c(k);
 55         for(int i=t[x];i<=d[x];i++){
 56             if(a[i][l[x]]!=k)b[x][c(a[i][l[x]])]=true;
 57             if(a[i][r[x]]!=k)b[x][c(a[i][r[x]])]=true;
 58         }
 59         for(int j=l[x];j<=r[x];j++){
 60             if(a[t[x]][j]!=k)b[x][c(a[t[x]][j])]=true;
 61             if(a[d[x]][j]!=k)b[x][c(a[d[x]][j])]=true;
 62         }
 63     }
 64     for(char i=A;i<=max_alpha;i++)deg[c(i)]=0;
 65     for(char i=A;i<=max_alpha;i++)
 66         for(char j=A;j<=max_alpha;j++)if(b[c(i)][c(j)])deg[c(j)]++;
 67 }
 68 void dfs(int tot)
 69 {
 70     if(tot==max_alpha-A+1){
 71         ans[tot]=\0;
 72         puts(ans);
 73         return;
 74     }
 75     for(char i=A;i<=max_alpha;i++){
 76         int x=c(i);
 77         if(deg[x]==0){
 78             deg[x]--;
 79             ans[tot]=i;
 80             for(char j=A;j<=max_alpha;j++){
 81                 int xx=c(j);
 82                 if(b[x][xx])deg[xx]--;
 83             }
 84             dfs(tot+1);
 85             deg[x]++;
 86             for(char j=A;j<=max_alpha;j++){
 87                 int xx=c(j);
 88                 if(b[x][xx])deg[xx]++;
 89             }
 90         }
 91     }
 92 }
 93 
 94 int main()
 95 {
 96     while(cin>>h>>w){
 97         init();
 98         build();
 99         dfs(0);        
100     }
101     return 0;
102 }

 

重写POJ1128

标签:

原文地址:http://www.cnblogs.com/happyJimmyLin/p/4601056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!