求助

P2741 [USACO4.4] 重叠的图像Frame Up

```cpp /************************************************************************* > File Name: 2741.cpp > Author: huhao > Mail: [email protected] > Created Time: 2017/5/6 13:43:06 ************************************************************************/ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<string> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> using namespace std; #define inf 0x3f3f3f3f #define eps 1e-8 #define rt return #define gc getchar() #define ll long long #define fr(i,a,b) for(int i=a,_end_=b;i<=_end_;i++) #define fd(i,a,b) for(int i=a,_end_=b;i>=_end_;i--) void SWAP(int a,int b) { a^=b^=a^=b; } int read() { int r=1,t=0; char c=gc; while(c<'0'||c>'9') { if(c=='-') r=-1; else r=1; c=gc; } while(c>='0'&&c<='9') { t=(t<<1)+(t<<3)+(c^48); c=gc; } rt r*t; } char readchar(int x,int y) { char c=gc; while(c<x||c>y) c=gc; rt c; } double log(double x,double y) { rt log10(x)/log10(y); } int gcd(int x,int y) { rt y?gcd(y,x%y):x; } int lcm(int x,int y) { rt x*y/gcd(x,y); } int n,m,a[40][40],del[40],p[40],maxx,t[40][10],f[40][40],r[40]; char pr[40]; void print(char *pr) { int k=0; while(pr[k]) k++; while(k) putchar(pr[--k]); } void dfs(int x) { if(x==maxx) puts(pr); fr(i,1,maxx) if(!r[i]) { int flag=1; fr(j,1,maxx) if(i!=j&&f[i][j]&&r[j]==0) { flag=0; break; } if(!flag) continue; r[i]=1; pr[x]=i-1+'A'; dfs(x+1); r[i]=0; pr[x]=0; } } int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif n=read(); m=read(); fr(i,1,n) fr(j,1,m) { char c=readchar('.','Z'); if(c!='.') p[a[i][j]=c-'A'+1]=1; } fr(i,2,26) del[i]=del[i-1]+!p[i-1]; fr(i,1,n) fr(j,1,m) a[i][j]-=del[a[i][j]]; fr(i,1,n) fr(j,1,m) maxx=a[i][j]<maxx?maxx:a[i][j]; fr(i,1,n) fr(j,1,m) t[a[i][j]][1]=t[a[i][j]][1]?t[a[i][j]][1]:i; fd(i,n,1) fr(j,1,m) t[a[i][j]][2]=t[a[i][j]][2]?t[a[i][j]][2]:i; fr(j,1,m) fr(i,1,n) t[a[i][j]][3]=t[a[i][j]][3]?t[a[i][j]][3]:j; fd(j,m,1) fr(i,1,n) t[a[i][j]][4]=t[a[i][j]][4]?t[a[i][j]][4]:j; fr(i,1,maxx) { fr(j,t[i][1],t[i][2]) if(a[j][t[i][3]]!=i) f[a[j][t[i][3]]][i]=1; fr(j,t[i][1],t[i][2]) if(a[j][t[i][3]]!=i) f[a[j][t[i][3]]][i]=1; fr(j,t[i][3],t[i][4]) if(a[t[i][1]][j]!=i) f[a[t[i][1]][j]][i]=1; fr(j,t[i][3],t[i][4]) if(a[t[i][2]][j]!=i) f[a[t[i][2]][j]][i]=1; } fr(i,1,maxx) fr(j,1,maxx) fr(k,1,maxx) if(f[i][k]&&f[k][j]) f[i][j]=1; dfs(0); rt 0; } //重发一遍 ```
by huhao @ 2017-05-06 16:33:19


|