【USACO】Transformations
A square pattern of size N x N (1 <= N <= 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to the original pattern given the following list of possible transformations:
- #1: 90 Degree Rotation: The pattern was rotated clockwise 90 degrees.
- #2: 180 Degree Rotation: The pattern was rotated clockwise 180 degrees.
- #3: 270 Degree Rotation: The pattern was rotated clockwise 270 degrees.
- #4: Reflection: The pattern was reflected horizontally (turned into a mirror image of itself by reflecting around a vertical line in the middle of the image).
- #5: Combination: The pattern was reflected horizontally and then subjected to one of the rotations (#1-#3).
- #6: No Change: The original pattern was not changed.
- #7: Invalid Transformation: The new pattern was not obtained by any of the above methods.
In the case that more than one transform could have been used, choose the one with the minimum number above.
PROGRAM NAME: transform
INPUT FORMAT
Line 1: | A single integer, N |
Line 2..N+1: | N lines of N characters (each either `@' or `-'); this is the square before transformation |
Line N+2..2*N+1: | N lines of N characters (each either `@' or `-'); this is the square after transformation |
SAMPLE INPUT (file transform.in)
3 @-@ --- @@- @-@ @-- --@
OUTPUT FORMAT
A single line containing the the number from 1 through 7 (described above) that categorizes the transformation required to change from the `before' representation to the `after' representation.
SAMPLE OUTPUT (file transform.out)
1
一A的题,好happy。
不难,就是很麻烦。我是把前四个操作写成四个函数。其中旋转90度作为基本的函数,旋转180和旋转270都是由两次和三次旋转90度得到。
主要的问题就是int**和int a[][11]这两种传递参数时候遇到的麻烦,不知道怎么把两者统一起来,所以每次都要先把int**复制到一个数组里面,再作为参数传递给下一个函数,下午去找找资料吧。
1 /*ID:Moment1991 2 PROG:transform 3 LANG:C++ 4 Compiling... 5 Compile: OK 6 7 Executing... 8 Test 1: TEST OK [0.000 secs, 3496 KB] 9 Test 2: TEST OK [0.003 secs, 3496 KB] 10 Test 3: TEST OK [0.008 secs, 3496 KB] 11 Test 4: TEST OK [0.008 secs, 3496 KB] 12 Test 5: TEST OK [0.005 secs, 3496 KB] 13 Test 6: TEST OK [0.003 secs, 3496 KB] 14 Test 7: TEST OK [0.005 secs, 3496 KB] 15 Test 8: TEST OK [0.005 secs, 3496 KB] 16 17 All tests OK. 18 */ 19 #include <iostream> 20 #include <fstream> 21 #include <stdlib.h> 22 using namespace std; 23 24 //旋转90度的操作 25 int **transiformation_one(int before[][11],int n){ 26 int **tran = new int*[11]; 27 for(int i = 0;i < 11;i++){ 28 tran[i] = new int[11]; 29 } 30 for(int i = 0;i < n;i++) 31 for(int j = 0;j < n;j ++){ 32 tran[j][n-i-1] = before[i][j]; 33 } 34 return tran; 35 } 36 37 //旋转180由两次旋转90度得到 38 int **transiformation_two(int before[][11],int n){ 39 int **tran_1 = transiformation_one(before,n); 40 int temp[11][11]; 41 for(int i = 0;i < n;i++) 42 for(int j = 0;j < n;j ++) 43 temp[i][j] = tran_1[i][j]; 44 int **tran_2 = transiformation_one(temp,n); 45 return tran_2; 46 } 47 48 //旋转270由三次旋转90度得到 49 int **transiformation_three(int before[][11],int n){ 50 int **tran_1 = transiformation_one(before,n); 51 int temp[11][11]; 52 for(int i = 0;i < n;i++) 53 for(int j = 0;j < n;j ++) 54 temp[i][j] = tran_1[i][j]; 55 56 int **tran_2 = transiformation_one(temp,n); 57 for(int i = 0;i < n;i++) 58 for(int j = 0;j < n;j ++) 59 temp[i][j] = tran_2[i][j]; 60 61 int **tran_3 = transiformation_one(temp,n); 62 return tran_3; 63 } 64 65 //沿竖直方向翻转 66 int **transiformation_four(int before[][11],int n){ 67 int **tran = new int*[11]; 68 for(int i = 0;i < 11;i++){ 69 tran[i] = new int[11]; 70 } 71 72 for(int j = 0;j <= n/2;j++){ 73 for(int i = 0;i < n;i ++){ 74 tran[i][n-j-1] = before[i][j]; 75 tran[i][j] = before[i][n-j-1]; 76 } 77 } 78 return tran; 79 } 80 81 //判断两个矩阵是否相等 82 bool is_equal(int **tran,int after[][11],int n){ 83 for(int i = 0;i < n;i ++) 84 for(int j = 0;j < n;j ++) 85 if(tran[i][j] != after[i][j]){ 86 return false; 87 } 88 return true; 89 } 90 91 //没办法统一int**和inta[][11],只好写两个判断相等函数 92 bool another_equal(int tran[][11],int after[][11],int n){ 93 for(int i = 0;i < n;i ++) 94 for(int j = 0;j < n;j ++) 95 if(tran[i][j] != after[i][j]) 96 return false; 97 return true; 98 } 99 100 int main(){ 101 ifstream cin("transform.in"); 102 ofstream cout("transform.out"); 103 104 int n; 105 char a; 106 int before[11][11]; 107 int after[11][11]; 108 109 cin >> n; 110 for(int i = 0;i < n;i++) 111 for(int j = 0;j < n;j++){ 112 cin >> a; 113 if(a == '@') 114 before[i][j] = 0; 115 else 116 before[i][j] = 1; 117 } 118 119 for(int i = 0;i < n;i++) 120 for(int j = 0;j < n;j++) 121 { 122 cin >> a; 123 if(a == '@') 124 after[i][j] = 0; 125 else 126 after[i][j] = 1; 127 } 128 129 int **tran = transiformation_one(before,n); 130 if(is_equal(tran,after,n)) 131 { 132 cout <<1<<endl; 133 free(tran); 134 return 0; 135 } 136 137 tran = transiformation_two(before,n); 138 if(is_equal(tran,after,n)) 139 { 140 cout <<2<<endl; 141 free(tran); 142 return 0; 143 } 144 145 tran = transiformation_three(before,n); 146 if(is_equal(tran,after,n)) 147 { 148 cout <<3<<endl; 149 free(tran); 150 return 0; 151 } 152 153 tran = transiformation_four(before,n); 154 if(is_equal(tran,after,n)) 155 { 156 cout <<4<<endl; 157 free(tran); 158 return 0; 159 } 160 161 //组合操作,调用多个函数实现 162 tran = transiformation_four(before,n); 163 164 int temp[11][11]; 165 for(int i = 0;i < n;i++) 166 for(int j = 0;j < n;j ++) 167 temp[i][j] = tran[i][j]; 168 int **tran_2 = transiformation_one(temp,n); 169 170 if(is_equal(tran_2,after,n)) 171 { 172 cout <<5<<endl; 173 free(tran); 174 free(tran_2); 175 return 0; 176 } 177 else{ 178 tran_2 = transiformation_two(temp,n); 179 if(is_equal(tran_2,after,n)) 180 { 181 cout <<5<<endl; 182 free(tran); 183 free(tran_2); 184 return 0; 185 } 186 } 187 tran_2 = transiformation_three(temp,n); 188 if(is_equal(tran_2,after,n)) 189 { 190 cout <<5<<endl; 191 free(tran); 192 free(tran_2); 193 return 0; 194 } 195 196 if(another_equal(before,after,n)) 197 { 198 cout << 6<<endl; 199 return 0; 200 } 201 202 cout <<7<<endl; 203 return 0; 204 205 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了