78 方块转换
问题描述 :
一块N x N(1=<N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。
写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
比如:
转换前:
@-@
---
@@-
转换后:
@-@
@--
--@
这种转换采取#1(按顺时针转90度)即可。
注意:图案中的字符“@”和“-”在转90度后,还是“@”和“-”。不要认为“-”转90度后变成“|”。
输入说明 :
第一行: 单独的一个整数N。
第二行到第N+1行: N行,每行N个字符(不是'@'就是'-');这是转换前的正方形。
第N+2行到第2*N+1行: N行,每行N个字符(不是'@'就是'-');这是转换后的正方形。
输出说明 :
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。
输入范例 :
3
--@
--@
---
@@-
---
---
输出范例 :3
思想:按题目要求写了,每种情况都写一个judge,然后返回最先符合的情况即可。
#include <stdio.h> #include <stdlib.h> char origin[10][10]; char change[10][10]; int judge1(int num){ //90° int i,j,k; int count =0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[j][num-1-i]){ count++; } } } return count; } int judge2(int num){ //180° int i,j,k; int count =0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[num-i-1][num-1-j]){ count++; } } } return count; } int judge3(int num){ //270° int i,j,k; int count =0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[num-1-j][i]){ count++; } } } return count; } int judge4(int num){ //镜像 int i,j,k; int count =0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[i][num-j-1]){ count++; } } } return count; } int judge5(int num){ //组合 int i,j,k; int count =0; char temp[num][num]; for(i=0;i<num;i++){ for(j=0;j<num;j++){ temp[i][j] = origin[i][num-j-1]; } } for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(temp[i][j]==change[j][num-1-i]){ count++; } } } if(count==num*num){ return count; } count = 0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(temp[i][j]==change[num-i-1][num-j-1]){ count++; } } } if(count==num*num){ return count; } count = 0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[num-1-j][i]){ count++; } } } if(count==num*num){ return count; } return 0; } int judge6(int num){ //相同 int i,j,k; int count =0; for(i=0;i<num;i++){ for(j=0;j<num;j++){ if(origin[i][j]==change[i][j]){ count++; } } } return count; } int main() { int num,i,j,k,l,m; scanf("%d",&num); for(i=0;i<num;i++){ for(j=0;j<num;j++){ scanf(" %c",&origin[i][j]); } } for(l=0;l<num;l++){ for(m=0;m<num;m++){ scanf(" %c",&change[l][m]); } } if(judge1(num)==num*num){ printf("1"); }else if(judge2(num)==num*num){ printf("2"); }else if(judge3(num)==num*num){ printf("3"); }else if(judge4(num)==num*num){ printf("4"); }else if(judge5(num)==num*num){ printf("5"); }else if(judge6(num)==num*num){ printf("6"); }else{ printf("7"); } }