POJ1128

很显然地一个拓扑排序。

根据题意很容易能够构图,由于需要求所有的拓扑序列,于是dfs,我们通过记录edge来修复in[].

代码质量很烂,vis完全可以用in=-1的情况替代,这里注意到memset赋值的大小问题。

以及一直WA,原因在于,total并没有初始化为零,虽然在最开始初始化了,但是后来会被修改。

这件事情告诉我们,初始化最好还是新建一个函数,在init里初始化,即每次都要初始化,即使是全局变量。

 1 /***********************
 2     Accepted
 3     Memory 660K
 4     Time    0MS
 5     2015-06-05
 6     POJ 1128
 7 ***********************/
 8 #include<iostream>
 9 #include<cstdio>
10 #include<cstring>
11 #include<string>
12 
13 using namespace std;
14 const int maxn=40;
15 int h,w;
16 bool edge[maxn][maxn];
17 bool vis[maxn];
18 int in[maxn];
19 char a[maxn][maxn];
20 int total;
21 void build()
22 {
23     int l[maxn],r[maxn],t[maxn],b[maxn];
24     total=0;
25     memset(vis,0,sizeof(vis));
26     memset(edge,0,sizeof(edge));
27     memset(l,0x3f,sizeof(l));
28     memset(r,-1,sizeof(r));
29     memset(t,0x3f,sizeof(t));
30     memset(b,-1,sizeof(b));
31     memset(in,-1,sizeof(in));
32     for(int i=1;i<=h;i++)
33         for(int j=1;j<=w;j++){
34             char c=a[i][j-1];
35             if(c=='.')continue;
36             int cn=c-'A';
37             if(!vis[cn]){
38                 vis[cn]=true;
39                 in[cn]=0;
40                 total++;
41             }
42             l[cn]=min(l[cn],j);
43             r[cn]=max(r[cn],j);
44             t[cn]=min(t[cn],i);
45             b[cn]=max(b[cn],i);
46         }
47     memset(vis,0,sizeof(vis));
48     for(int k=0;k<maxn;k++){
49         if(in[k]==-1)continue;
50         for(int j=l[k];j<=r[k];j++){
51             if(a[t[k]][j-1]-'A'!=k)edge[k][a[t[k]][j-1]-'A']=true;
52             if(a[b[k]][j-1]-'A'!=k)edge[k][a[b[k]][j-1]-'A']=true;
53         }
54         for(int i=t[k];i<=b[k];i++){
55             if(a[i][l[k]-1]-'A'!=k)edge[k][a[i][l[k]-1]-'A']=true;
56             if(a[i][r[k]-1]-'A'!=k)edge[k][a[i][r[k]-1]-'A']=true;
57         }
58     }
59     for(int k=0;k<maxn;k++)
60         for(int j=0;j<maxn;j++)if(edge[k][j])in[j]++;
61 }
62 char str[maxn];
63 
64 void dfs(int x){
65     if(x==total){
66         str[total]='\0';
67         puts(str);
68         return;
69     }
70     for(int k=0;k<maxn;k++)if(!in[k]&&!vis[k]){
71         vis[k]=true;
72         for(int j=0;j<maxn;j++)if(edge[k][j])in[j]--;
73         str[x]=k+'A'; 
74         dfs(x+1);
75         vis[k]=false;
76         for(int j=0;j<maxn;j++)if(edge[k][j])in[j]++;
77     }
78 }
79 int main()
80 {
81     while(scanf("%d%d",&h,&w)==2){
82         for(int i=1;i<=h;i++)scanf("%s",a[i]);
83         memset(edge,0,sizeof(edge));
84         build();
85         dfs(0);
86     }
87     return 0;
88 }

 

/***********************
    Accepted
    Memory 660K
    Time    0MS
    2015-06-05
    POJ 1128
***********************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>

using namespace std;
const int maxn=40;
int h,w;
bool edge[maxn][maxn];
bool vis[maxn];
int in[maxn];
char a[maxn][maxn];
int total;
void build()
{
    int l[maxn],r[maxn],t[maxn],b[maxn];
    total=0;
    memset(vis,0,sizeof(vis));
    memset(edge,0,sizeof(edge));
    memset(l,0x3f,sizeof(l));
    memset(r,-1,sizeof(r));
    memset(t,0x3f,sizeof(t));
    memset(b,-1,sizeof(b));
    memset(in,-1,sizeof(in));
    for(int i=1;i<=h;i++)
        for(int j=1;j<=w;j++){
            char c=a[i][j-1];
            if(c=='.')continue;
            int cn=c-'A';
            if(!vis[cn]){
                vis[cn]=true;
                in[cn]=0;
                total++;
            }
            l[cn]=min(l[cn],j);
            r[cn]=max(r[cn],j);
            t[cn]=min(t[cn],i);
            b[cn]=max(b[cn],i);
        }
    memset(vis,0,sizeof(vis));
    for(int k=0;k<maxn;k++){
        if(in[k]==-1)continue;
        for(int j=l[k];j<=r[k];j++){
            if(a[t[k]][j-1]-'A'!=k)edge[k][a[t[k]][j-1]-'A']=true;
            if(a[b[k]][j-1]-'A'!=k)edge[k][a[b[k]][j-1]-'A']=true;
        }
        for(int i=t[k];i<=b[k];i++){
            if(a[i][l[k]-1]-'A'!=k)edge[k][a[i][l[k]-1]-'A']=true;
            if(a[i][r[k]-1]-'A'!=k)edge[k][a[i][r[k]-1]-'A']=true;
        }
    }
    for(int k=0;k<maxn;k++)
        for(int j=0;j<maxn;j++)if(edge[k][j])in[j]++;
}
char str[maxn];

void dfs(int x){
    if(x==total){
        str[total]='\0';
        puts(str);
        return;
    }
    for(int k=0;k<maxn;k++)if(!in[k]&&!vis[k]){
        vis[k]=true;
        for(int j=0;j<maxn;j++)if(edge[k][j])in[j]--;
        str[x]=k+'A';
        dfs(x+1);
        vis[k]=false;
        for(int j=0;j<maxn;j++)if(edge[k][j])in[j]++;
    }
}
int main()
{
    while(scanf("%d%d",&h,&w)==2){
        for(int i=1;i<=h;i++)scanf("%s",a[i]);
        memset(edge,0,sizeof(edge));
        build();
        dfs(0);
    }
    return 0;
}

posted @ 2015-06-05 17:29  JimmyLin^_^  阅读(145)  评论(0编辑  收藏  举报