生活随笔
收集整理的這篇文章主要介紹了
NOI 练手题 图像旋转翻转变换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:來源http://noi.openjudge.cn/ch0112/09/
總時間限制:?1000ms內存限制:?65536kB描述 給定m行n列的圖像各像素點灰度值,對其依次進行一系列操作后,求最終圖像。
其中,可能的操作及對應字符有如下四種:
A:順時針旋轉90度;
B:逆時針旋轉90度;
C:左右翻轉;
D:上下翻轉。
輸入第一行包含兩個正整數m和n,表示圖像的行數和列數,中間用單個空格隔開。1 <= m <= 100, 1 <= n <= 100。
接下來m行,每行n個整數,表示圖像中每個像素點的灰度值,相鄰兩個數之間用單個空格隔開。灰度值范圍在0到255之間。
接下來一行,包含由A、B、C、D組成的字符串s,表示需要按順序執行的操作序列。s的長度在1到100之間。輸出m'行,每行包含n'個整數,為最終圖像各像素點的灰度值。其中m'為最終圖像的行數,n'為最終圖像的列數。相鄰兩個整數之間用單個空格隔開。樣例輸入 2 3
10 0 10
100 100 10
AC 解析: 題目要求轉換最終的結果。分析題目發現,它的變換情況只有兩種:旋轉、翻轉(軸對稱)。 通過我們自己的想象可以知道: 無論圖形按照ABCD的命令怎么變換,最終也只會有八種形態: 1.不翻轉,順時針旋轉0°,即不變 2.不翻轉,順時針旋轉90° 3.不翻轉,順時針旋轉180° 4.不翻轉,順時針旋轉2700° 5.按某一個方向翻轉后,順時針旋轉0°
6.按某一個方向翻轉后,順時針旋轉90°
7.按某一個方向翻轉后,順時針旋轉180°
8.按某一個方向翻轉后,順時針旋轉270° (為了方便,我們同一將 “按某一個方向翻轉” 改為 “按圖形左邊緣為對稱軸進行軸對稱”) 于是我們可以畫出圖形經過翻轉后的八種形態(對于我這個懶人,拿一張紙直接變換,是懶得用腦子想象的一種好方法)。| 1 | ? | ? | ? | 2 | ? | ? | ? | 3 | ? | ? | ? | 4 | ? | ? |
| 1 | 2 | 3 | ? | 7 | 4 | 1 | ? | 9 | 8 | 7 | ? | 3 | 6 | 9 |
| 4 | 5 | 6 | ? | 8 | 5 | 2 | ? | 6 | 5 | 4 | ? | 2 | 5 | 8 |
| 7 | 8 | 9 | ? | 9 | 6 | 3 | ? | 3 | 2 | 1 | ? | 1 | 4 | 7 |
| ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
| 5 | ? | ? | ? | 6 | ? | ? | ? | 7 | ? | ? | ? | 8 | ? | ? |
| 3 | 2 | 1 | ? | 9 | 6 | 3 | ? | 7 | 8 | 9 | ? | 1 | 4 | 7 |
| 6 | 5 | 4 | ? | 8 | 5 | 2 | ? | 4 | 5 | 6 | ? | 2 | 5 | 8 |
| 9 | 8 | 7 | ? | 7 | 4 | 1 | ? | 1 | 2 | 3 | ? | 3 | 6 | 9 |
最樸素的算法,就是按照命令的形式,一次一次地翻轉圖形,但是這很耗時間,基本上就別想Accept了。 我們在此基礎上做了點改進: 按照命令的形式,一次一次地翻轉“圖形的形態” ——什么意思?我們可以把圖形每種樣子做一個編碼,就像警察發通緝令,有時候嫌疑人的照片一張不夠:戴牛仔帽的,穿夾克的,叼雪茄的……我們也是如此(如上圖所示)。 我們在一個函數中完成對命令的解析,傳回圖形最后的形態(給它一頓最后的晚餐~~)。 之后也有一種優化的方法: 原來我們想著就直接把圖形真正做一個變換,但是如果圖形太大,這也很耗時間; 所以我們不妨從輸出下手,改變輸出的順序,來達到變換圖形的效果。代碼:(為人類造福) 1 #include <stdio.h>
2 #include <
string.h>
3 struct command{
4 char str[
101];
5 int length;
6 };
7 int ExplainCommand(
struct command s);
8 void Print(
int *pho,
int way,
int height,
int width);
9 int main()
10 {
11 int m,n,i,j;
12 int pho[
10000];
13 struct command s;
14
15
16 scanf(
"%d%d",&m,&
n);
17 for(i=
0;i<m;i++
)
18 {
19 for(j=
0;j<n;j++
)
20 {
21 scanf(
"%d",&pho[i*n+
j]);
22 }
23 }
24 getchar();
25 gets(s.str);
26 s.length=
strlen(s.str);
27
28 Print(pho,ExplainCommand(s),m,n);
29
30 return 0;
31 }
32 int ExplainCommand(
struct command s)
//對命令行做解析,分析出最終的形態
33 {
34 int ans=
1;
//假定目前最終形態為不變
35 int i;
36 for(i=
0;i<s.length;i++
)
37 {
38 if(s.str[i]==
'A')
39 {
40 switch(ans)
41 {
42 case 1: ans=
2 ;
break;
43 case 2: ans=
3 ;
break;
44 case 3: ans=
4 ;
break;
45 case 4: ans=
1 ;
break;
46 case 5: ans=
6 ;
break;
47 case 6: ans=
7 ;
break;
48 case 7: ans=
8 ;
break;
49 case 8: ans=
5 ;
break;
50 }
51 }
52
53 else if(s.str[i]==
'B')
54 {
55 switch(ans)
56 {
57 case 1: ans=
4 ;
break;
58 case 2: ans=
1 ;
break;
59 case 3: ans=
2 ;
break;
60 case 4: ans=
3 ;
break;
61 case 5: ans=
8 ;
break;
62 case 6: ans=
5 ;
break;
63 case 7: ans=
6 ;
break;
64 case 8: ans=
7 ;
break;
65 }
66 }
67 else if(s.str[i]==
'C')
68 {
69 switch(ans)
70 {
71 case 1: ans=
5 ;
break;
72 case 2: ans=
8 ;
break;
73 case 3: ans=
7 ;
break;
74 case 4: ans=
6 ;
break;
75 case 5: ans=
1 ;
break;
76 case 6: ans=
4 ;
break;
77 case 7: ans=
3 ;
break;
78 case 8: ans=
2 ;
break;
79 }
80 }
81 else if(s.str[i]==
'D')
82 {
83 switch(ans)
84 {
85 case 1: ans=
7 ;
break;
86 case 2: ans=
6 ;
break;
87 case 3: ans=
5 ;
break;
88 case 4: ans=
8 ;
break;
89 case 5: ans=
3 ;
break;
90 case 6: ans=
2 ;
break;
91 case 7: ans=
1 ;
break;
92 case 8: ans=
4 ;
break;
93 }
94 }
95 }
96 return ans;
97 }
98 void Print(
int *pho,
int way,
int height,
int width)
99 {
100 /*圖形經過各種旋轉變換后,最后的形態只有8種
101 *前四種:
102 *1=未翻轉,順時針旋轉 0
103 *2=未翻轉,順時針旋轉 90
104 *3=未翻轉,順時針旋轉 180
105 *4=未翻轉,順時針旋轉 270
106 *后四種:
107 *5=以圖形左邊為對稱軸對稱,順時針旋轉 0
108 *6=以圖形左邊為對稱軸對稱,順時針旋轉 90
109 *7=以圖形左邊為對稱軸對稱,順時針旋轉 180
110 *8=以圖形左邊為對稱軸對稱,順時針旋轉 270
111 */
112 int i,j,temp;
113
114
115 if(way==
1)
116 {
117 for(i=
0;i<height;i++
)
118 {
119 for(j=
0;j<width;j++
)
120 {
121 temp=*(pho+i*width+
j);
122 printf(
"%d ",temp);
123 }
124 printf(
"\n");
125 }
126 }
127
128
129 else if(way==
2)
130 {
131 for(j=
0;j<width;j++
)
132 {
133 for(i=height-
1;i>=
0;i--
)
134 {
135 temp=*(pho+i*width+
j);
136 printf(
"%d ",temp);
137 }
138 printf(
"\n");
139 }
140 }
141
142
143 else if(way==
3)
144 {
145 for(i=height-
1;i>=
0;i--
)
146 {
147 for(j=width-
1;j>=
0;j--
)
148 {
149 temp=*(pho+i*width+
j);
150 printf(
"%d ",temp);
151 }
152 printf(
"\n");
153 }
154 }
155
156
157 else if(way==
4)
158 {
159 for(j=width-
1;j>=
0;j--
)
160 {
161 for(i=
0;i<height;i++
)
162 {
163 temp=*(pho+i*width+
j);
164 printf(
"%d ",temp);
165 }
166 printf(
"\n");
167 }
168
169 }
170
171
172 else if(way==
5)
173 {
174 for(i=
0;i<height;i++
)
175 {
176 for(j=width-
1;j>=
0;j--
)
177 {
178 temp=*(pho+i*width+
j);
179 printf(
"%d ",temp);
180 }
181 printf(
"\n");
182 }
183 }
184
185
186 else if(way==
6)
187 {
188 for(j=width-
1;j>=
0;j--
)
189 {
190 for(i=height-
1;i>=
0;i--
)
191 {
192 temp=*(pho+i*width+
j);
193 printf(
"%d ",temp);
194 }
195 printf(
"\n");
196 }
197 }
198
199
200 else if(way==
7)
201 {
202 for(i=height-
1;i>=
0;i--
)
203 {
204 for(j=
0;j<width;j++
)
205 {
206 temp=*(pho+i*width+
j);
207 printf(
"%d ",temp);
208 }
209 printf(
"\n");
210 }
211 }
212
213
214 else if(way==
8)
215 {
216 for(j=
0;j<width;j++
)
217 {
218 for(i=
0;i<height;i++
)
219 {
220 temp=*(pho+i*width+
j);
221 printf(
"%d ",temp);
222 }
223 printf(
"\n");
224 }
225 }
226
227 return ;
228 }
不點開就不用花錢 ?請不要問我為什么不用二維數組——因為在傳參數的時候真心不好用……
?即使是用指針也如此(因為我不會呀~~)
?
轉載于:https://www.cnblogs.com/CXSheng/p/4889241.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的NOI 练手题 图像旋转翻转变换的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。