USACO 1.3.2 Transformations
題目連結:ofollow,noindex" target="_blank">http://train.usaco.org/usacoprob2?a=soZXEl5v0L0&S=transform
思路:恐怖的模擬。又掉入cin與scanf讀入字串的大坑和linux與windows下編譯的神奇操作。。。
程式碼:
/* ID:zylbeyo1 TASK:transform LANG:C++ */ #include <cstdio> #include <cstring> #include <iostream> const int MAXN=20; using namespace std; int n,step; char a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN]; namespace change { inline bool one() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[n-j+1][i]!=b[i][j]) return false; return true; } inline bool two() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[n-i+1][n-j+1]!=b[i][j]) return false; return true; } inline bool three() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[j][n-i+1]!=b[i][j]) return false; return true; } inline bool four() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][n-j+1]!=b[i][j]) return false; return true; } inline bool five() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c[i][j]=a[i][n-j+1]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=c[i][j]; if(one()) return true; if(two()) return true; if(three()) return true; return false; } inline bool six() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]!=b[i][j]) return false; return true; } } inline bool level(int ins) { if(ins==1) return change::one(); else if(ins==2) return change::two(); else if(ins==3) return change::three(); else if(ins==4) return change::four(); else if(ins==5) return change::five(); else if(ins==6) return change::six(); else return true; } int main() { freopen("transform.in","r",stdin); freopen("transform.out","w",stdout); scanf("%d\n",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%c",&a[i][j]);//cin>>a[i][j]; scanf("\n"); } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) scanf("%c",&b[i][j]);//cin>>b[i][j]; scanf("\n"); } while(step<=6) { step++; if(level(step)) return cout<<step<<endl,0; } fclose(stdin); fclose(stdout); return 0; }