zhao_ry514114
赵若伊

导航

 

不算题解只是个记录,数组旋转一类的题以后能用到。

P1205 [USACO1.2] 方块转换 Transformations

AC记录

一般数组水题都是模拟。按照题意码就是了。

  • 转 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。
posted on 2025-08-26 11:14  zhao_ry514114  阅读(17)  评论(0)    收藏  举报