Skip to main content

P1205 [USACO1.2] 方块转换 Transformations

· 2 min read
lailai
Student & Developer

解题思路

根据题意模拟即可,具体过程我就不写了。

其他几篇题解写得很详细,但代码都不够优雅。

参考代码

标准版(689B)

#include <bits/stdc++.h>
using namespace std;

using Grid=vector<string>;
Grid ref(Grid A)
{
for(auto &s:A)reverse(s.begin(),s.end());
return A;
}
Grid rot(Grid A)
{
for(int i=0;i<A.size();i++)for(int j=0;j<i;j++)swap(A[i][j],A[j][i]);
return ref(A);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
Grid A(n),B(n);
for(auto &s:A)cin>>s;
for(auto &s:B)cin>>s;
Grid C=ref(A);
if(rot(A)==B)cout<<1<<'\n';
else if(rot(rot(A))==B)cout<<2<<'\n';
else if(rot(rot(rot(A)))==B)cout<<3<<'\n';
else if(C==B)cout<<4<<'\n';
else if(rot(C)==B||rot(rot(C))==B||rot(rot(rot(C)))==B)cout<<5<<'\n';
else if(A==B)cout<<6<<'\n';
else cout<<7<<'\n';
return 0;
}

Golf 版(352B)

#import<bits/stdc++.h>
using namespace std;using G=vector<string>;int main(){int n,i,j;cin>>n;G A(n),B(n),C;for(G*x:{&A,&B})for(auto&s:*x)cin>>s;auto f=[](G&C){for(auto&s:C)reverse(begin(s),end(s));};auto r=[&](G&C){for(i=n;j=--i;)while(j--)swap(C[i][j],C[j][i]);f(C);return B==C;};f(C=A);cout<<(r(A)?1:r(A)?2:r(A)?3:C==B?4:r(C)|r(C)|r(C)?5:r(A)?6:7);}