我做题时,发现了一个难题目,我来讲一讲:
要求:
一块 n×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
转换方法:
转 90°:图案按顺时针转 90°。
转 180°:图案按顺时针转180°。
转 270°:图案按顺时针转270°。
反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
组合:图案在水平方向翻转,然后再按照1∼3 之间的一种再次转换。
不改变:原图案不改变。
无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
答案:
#include<bits/stdc++.h>
using namespace std;
int n;
char a[15][15],b[15][15],c[15][15],d[15][15];
bool work1(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[j][n-i+1]=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]!=c[i][j]){
return 0;
}
}
}
return 1;
}
bool work2(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[n-i+1][n-j+1]=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]!=c[i][j]){
return 0;
}
}
}
return 1;
}
bool work3(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[n-j+1][i]=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]!=c[i][j]){
return 0;
}
}
}
return 1;
}
bool work4(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][n-j+1]=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]!=c[i][j]){
return 0;
}
}
}
return 1;
}
bool work5(){
work4();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=b[i][j];
}
}
if(work1()){
return 1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=b[i][j];
}
}
if(work2()){
return 1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=b[i][j];
}
}
if(work3()){
return 1;
}
return 0;
}
bool work6(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]!=c[i][j]){
return 0;
}
}
}
return 1;
}
void work(){
if(work1()){
cout<<1;
return ;
}
if(work2()){
cout<<2;
return ;
}
if(work3()){
cout<<3;
return ;
}
if(work4()){
cout<<4;
return ;
}
if(work5()){
cout<<5;
return ;
}
if(work6()){
cout<<6;
return ;
}
cout<<7;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
d[i][j]=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
work();
return 0;
}
就是这么做,非常简单!