标签:
很显然地一个拓扑排序。
根据题意很容易能够构图,由于需要求所有的拓扑序列,于是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;
}
标签:
原文地址:http://www.cnblogs.com/happyJimmyLin/p/4555187.html