伊宁网站建设优化,优质的成都网站建设推广,游戏类网站备案,根据百度地图做网站题目描述
一块 n n n \times n nn 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式#xff1a; 转 90 90\degree 90#xff1a;图案按顺时针转 90 90\degree 90。 转 180 180\degree 180 转 90 ° 90\degree 90°图案按顺时针转 90 ° 90\degree 90°。 转 180 ° 180\degree 180°图案按顺时针转 180 ° 180\degree 180°。 转 270 ° 270\degree 270°图案按顺时针转 270 ° 270\degree 270°。 反射图案在水平方向翻转以中央铅垂线为中心形成原图案的镜像。 组合图案在水平方向翻转然后再按照 1 ∼ 3 1 \sim 3 1∼3 之间的一种再次转换。 不改变原图案不改变。 无效转换无法用以上方法得到新图案。
如果有多种可用的转换方法请选择序号最小的那个。
只使用上述 7 7 7 个中的一个步骤来完成这次转换。
输入格式
第一行一个正整数 n n n。
然后 n n n 行每行 n n n 个字符全部为 或 -表示初始的正方形。
接下来 n n n 行每行 n n n 个字符全部为 或 -表示最终的正方形。
输出格式
单独的一行包括 1 ∼ 7 1 \sim 7 1∼7 之间的一个数字在上文已描述表明需要将转换前的正方形变为转换后的正方形的转换方法。
样例 #1
样例输入 #1
3
-
---
-
-
--
--样例输出 #1
1提示
【数据范围】 对于 100 % 100\% 100% 的数据 1 ≤ n ≤ 10 1\le n \le 10 1≤n≤10。
1.题目分析
主要是考查二维数组的使用除此之外就是空间想象能力。 大概题意就是输入一个n表示矩阵的阶数输入两个字符N阶的字符矩阵 第一个矩阵表示初始图案第二个表示最终图案。 题目一共给出了七种方案和结果根据初始矩阵最后的变换结果输出是方案几。
值得一提的是我这里使用的是C的输入刚开始用的C写的需要使用getchar函数消除scanf函数的换行符但是由于做题网站的编译系统是部署在Linux上的依旧报错之所以这里使用了C的输入方式是因为他和Java一样是跨平台的。
2.题目思路
定义两个函数 比较函数输入两个数组比较是否相同用于判别最终结果。 打印函数用于查看临时数组里的图案变换情况。 将初始图案和目标图案分别存入字符二维数组arr1和arr2,定义一个临时二维数组用于和目标数组比较。接下来将初始图案变换之后赋值给临时数组顺序判断
转90转180转270反射组合不改变原图案不改变无效转换
这些变化就是一些行和列的交换也没什么好讲的
对应这七种变化如果满足临时数组和目标数组通过比较函数判别相同时则打印相应方案的序号。当然为了方便做题使用打印函数观察变化结果也是必不可少的。
3.代码演示
#include stdio.h
#include bits/stdc.husing namespace std;//比较两个数组是否一致
int compareTo(char arr1[10][10], char arr2[10][10], int n) {int flag 1;for (int i 0; i n; i) {for (int j 0; j n; j) {if (arr1[i][j] ! arr2[i][j]) {flag 0;}}}return flag;
}//用于查看图案变换情况
void print(char arr[10][10], int n) {for (int i 0; i n; i) {for (int j 0; j n; j) {printf(%c, arr[i][j]);}printf(\n);}
}int main() {int n;scanf(%d, n);char arr1[10][10];char arr2[10][10];char temp[10][10];char c;//初始图案插入for (int i 0; i n; i) {
// getchar();for (int j 0; j n; j) {
// scanf(%c, c);cin c;arr1[i][j] c;}}//最后结果的图案for (int i 0; i n; i) {//消除换行符
// getchar();for (int j 0; j n; j) {
// scanf(%c, c);cin c;arr2[i][j] c;}}//转90for (int i 0; i n; i) {for (int j 0; j n; j) {temp[j][n - 1 - i] arr1[i][j];}}if (compareTo(temp, arr2, n) 1) {printf(1\n);return 0;}//转180for (int i 0; i n; i) {for (int j 0; j n; j) {temp[n - 1 - i][n - 1 - j] arr1[i][j];}}if (compareTo(temp, arr2, n) 1) {printf(2\n);return 0;}//转270for (int i 0; i n; i) {for (int j 0; j n; j) {temp[n - 1 - j][i] arr1[i][j];}}if (compareTo(temp, arr2, n) 1) {printf(3\n);return 0;}//反射for (int i 0; i n; i) {for (int j 0; j n; j) {temp[i][n - 1 - j] arr1[i][j];}}if (compareTo(temp, arr2, n) 1) {printf(4\n);return 0;}//组合char ch[10][10];//用于存储组合之后的图案//1∼3 之间的一种再次转换。//组合转90for (int i 0; i n; i) {for (int j 0; j n; j) {ch[j][n - 1 - i] temp[i][j];}}if (compareTo(ch, arr2, n) 1) {printf(5\n);return 0;}//组合转180for (int i 0; i n; i) {for (int j 0; j n; j) {ch[n - 1 - i][n - 1 - j] temp[i][j];}}if (compareTo(ch, arr2, n) 1) {printf(5\n);return 0;}//组合转270for (int i 0; i n; i) {for (int j 0; j n; j) {ch[n - 1 - j][i] temp[i][j];}}if (compareTo(ch, arr2, n) 1) {printf(5\n);return 0;}//不改变原图案不改变if (compareTo(arr1, arr2, n) 1) {printf(6\n);return 0;}//无效转换if (compareTo(temp, arr2, n) 0 || compareTo(ch, arr2, n) 0) {printf(7\n);}return 0;
}