标签:
构图+拓扑排序。
虽然是第二次写,但是感觉自己还是很不熟。
求所有拓扑序列的时候,用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 }
标签:
原文地址:http://www.cnblogs.com/happyJimmyLin/p/4601056.html