首页 > 代码库 > 【USACO】Transformations
【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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。