USACO习题:Transformations
第一次题目没看清,以为是给定一个矩形,求最小的变换路线,我想SEC1和2原来差距如此之大啊。。。
后来仔细一看,只要变一次,这个题目就编程弱智题了。
我比较懒,没有一个一个旋转去写,而是实现了1个顺时针九十度和一个镜像。
顺时针90度,数组下标变换策略:目标矩阵(j,N-i-1) <-- 原矩阵(i,j) ,其中N为矩阵的宽度
垂直镜像:目标矩阵(i,j) <-- 原矩阵(i,N-j-1) ,其中N为矩阵的宽度
知道这些代码就非常好写
View Code
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4 #include <vector>
5 #include <algorithm>
6
7 using namespace std;
8
9
10 template<typename T>
11 void rotate90(vector<vector<T> > &src,vector<vector<T> > &dest){
12 int N=src.size();
13 for(T i=0;i<N;i++)
14 for(T j=0;j<N;++j)
15 dest[j][N-i-1] = src[i][j];
16 }
17
18 template<typename T>
19 void rotate180(vector<vector<T> > &src,vector<vector<T> > &dest){
20 int N=src.size();vector<vector<T> > buf(N,vector<T>(N,0));
21 rotate90(src,buf);
22 rotate90(buf,dest);
23 }
24
25 template<typename T>
26 void rotate270(vector<vector<T> > &src,vector<vector<T> > &dest){
27 int N=src.size();vector<vector<T> > buf(N,vector<T>(N,0));
28 rotate180(src,buf);
29 rotate90(buf,dest);
30 }
31
32 template<typename T>
33 void reflect(vector<vector<T> > &src,vector<vector<T> > &dest){
34 int N=src.size();
35 for(T i=0;i<N;i++)
36 for(T j=0;j<N;++j)
37 dest[i][j] = src[i][N-j-1];
38 }
39
40 template<typename T>
41 void reflect_rotate90(vector<vector<T> > &src,vector<vector<T> > &dest){
42 int N=src.size();vector<vector<T> > buf(N,vector<T>(N,0));
43 reflect(src,buf);
44 rotate90(buf,dest);
45 }
46
47 template<typename T>
48 void reflect_rotate180(vector<vector<T> > &src,vector<vector<T> > &dest){
49 int N=src.size();vector<vector<T> > buf(N,vector<T>(N,0));
50 reflect(src,buf);
51 rotate180(buf,dest);
52 }
53
54 template<typename T>
55 void reflect_rotate270(vector<vector<T> > &src,vector<vector<T> > &dest){
56 int N=src.size();vector<vector<T> > buf(N,vector<T>(N,0));
57 reflect(src,buf);
58 rotate270(buf,dest);
59 }
60
61
62
63 template<typename T>
64 void read_matrix(ifstream& is, vector<vector<T> > &dest){
65 int N=dest.size();
66 char temp=0;
67 for(int i=0;i<N;++i){
68 for(int j=0;j<N;++j){
69 is>>temp;
70 dest[i][j]=temp;
71 }
72 }
73 }
74
75 template<typename T>
76 void pm(vector<vector<T> > &matrix){
77 cout<<"--------------"<<endl;
78 for(int i=0;i<matrix.size();i++){
79 for(int j=0;j<matrix.size();++j)
80 cout<<matrix[i][j]<<" ";
81 cout<<endl;
82 }
83 }
84
85 template<typename T>
86 bool equal(vector<vector<T> > &src,vector<vector<T> > &dest){
87 for(int i=0;i<src.size();++i)
88 for(int j =0;j<src.size();++j)
89 if(src[i][j]!=dest[i][j])
90 return false;
91
92 return true;
93 }
94
95 int main() {
96 ofstream fout("transform.out");
97 ifstream fin("transform.in");
98
99 int length =0;
100 fin>>length;
101
102 vector<vector<char> > base(length,vector<char>(length,0));
103 vector<vector<char> > buf(length,vector<char>(length,0));
104 vector<vector<char> > dest(length,vector<char>(length,0));
105 read_matrix(fin,base);
106 read_matrix(fin,dest);
107
108 /*
109 pm(base);
110 pm(dest);
111
112
113 rotate90(base,buf);
114 pm(buf);
115 rotate180(base,buf);
116 pm(buf);
117 rotate270(base,buf);
118 pm(buf);
119 */
120
121
122 rotate90(base,buf);
123 if(equal(buf,dest)){
124 fout<<1<<endl;
125 goto end;
126 }
127
128 rotate180(base,buf);
129 if(equal(buf,dest)){
130 fout<<2<<endl;
131 goto end;
132 }
133
134 rotate270(base,buf);
135 if(equal(buf,dest)){
136 fout<<3<<endl;
137 goto end;
138 }
139
140
141 reflect(base,buf);
142 if(equal(buf,dest)){
143 fout<<4<<endl;
144 goto end;
145 }
146
147
148 reflect_rotate90(base,buf);
149 if(equal(buf,dest)){
150 fout<<5<<endl;
151 goto end;
152 }
153
154 reflect_rotate180(base,buf);
155 if(equal(buf,dest)){
156 fout<<5<<endl;
157 goto end;
158 }
159
160
161 reflect_rotate270(base,buf);
162 if(equal(buf,dest)){
163 fout<<5<<endl;
164 goto end;
165 }
166
167 if(equal(base,dest)){
168 fout<<6<<endl;
169 goto end;
170 }
171
172 fout<<7<<endl;
173
174
175
176 /*
177 for(int i=0;i<length;++i){
178 for(int j=0;j<length;++j){
179 fin>>src[i][j];
180 }
181 }
182 */
183 //read_matrix(fin,src);
184
185
186 /*
187
188 char abc[][3] = {
189 '1','2','3',
190 '4','5','6',
191 '7','8','9'
192 };
193
194
195 char buf[3][3];
196
197 pmatrix(abc);
198 rotate90(abc,buf);
199 pmatrix(buf);
200 rotate180(abc,buf);
201 pmatrix(buf);
202 rotate270(abc,buf);
203 pmatrix(buf);
204 reflect(abc,buf);
205 pmatrix(buf);
206 reflect_rotate90(abc,buf);
207 pmatrix(buf);
208 reflect_rotate180(abc,buf);
209 pmatrix(buf);
210 reflect_rotate270(abc,buf);
211 pmatrix(buf);
212
213 */
214
215 end:
216
217 fin.close();
218 fout.close();
219 return 0;
220 }