不算题解只是个记录,数组旋转一类的题以后能用到。
P1205 [USACO1.2] 方块转换 Transformations
一般数组水题都是模拟。按照题意码就是了。
- 转 90°:图案按顺时针转 90°。
bool x1(char a[12][12],char b[12][12]) {
bool x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!(a[i][j]==b[j][n-i-1]))x=0;
}
if(x==0)break;
}
return x;
}
- 转 180°:图案按顺时针转 180°。
bool x2(char a[12][12],char b[12][12]) {
bool x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!(a[i][j]==b[n-i-1][n-j-1]))x=0;
}
if(x==0)break;
}
return x;
}
- 转 270°:图案按顺时针转 270°。
bool x3(char a[12][12],char b[12][12]) {
bool x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!(a[i][j]==b[n-j-1][i]))x=0;
}
if(x==0)break;
}
return x;
}
- 反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
bool x4(char a[12][12],char b[12][12]){
bool x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(!(a[i][j]==b[i][n-j-1]))x=0;
}
if(x==0)break;
}
return x;
}
- 组合:图案在水平方向翻转,然后再按照 1 ~ 3 之间的一种再次转换。
void g1(char a[12][12]){
char c[12][12];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c[i][n-j-1]=a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=c[i][j];
}
}
}
void g2(char a[12][12]){
char c[12][12];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c[j][n-i-1]=a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=c[i][j];
}
}
}
void g3(char a[12][12]){
char c[12][12];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c[n-i-1][n-j-1]=a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=c[i][j];
}
}
}
void g4(char a[12][12]){
char c[12][12];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c[n-j-1][i]=a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
a[i][j]=c[i][j];
}
}
}
bool x5(char a[12][12],char b[12][12]){
bool x=1;
g1(a);
char c1[12][12],c2[12][12],c3[12][12];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
c1[i][j]=a[i][j];
c2[i][j]=a[i][j];
c3[i][j]=a[i][j];
//cout<<a[i][j]<<' ';
}
//cout<<endl;
}
g2(c1);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(c1[i][j]!=b[i][j])x=0;
}
if(!x)break;
}
if(x)return 1;
g3(c2);
x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(c2[i][j]!=b[i][j])x=0;
//cout<<c2[i][j]<<' ';
}
//cout<<endl;
if(!x)break;
}
if(x)return 1;
g4(c3);
x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(c3[i][j]!=b[i][j])x=0;
}
if(!x)break;
}
if(x)return 1;
return 0;
}
- 不改变:原图案不改变。
bool x6(char a[12][12],char b[12][12]){
bool x=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]!=b[i][j])x=0;
}
if(!x)break;
}
return x;
}
- 无效转换:无法用以上方法得到新图案。
前面模拟完就return 0;
,后面剩下的都是7。