UVa 918 - ASCII Mandelbrot

contents

  1. 1. Problem
  2. 2. Sample Input
  3. 3. Sample Output
  4. 4. Solution

Problem

根據題目意思,Z = 0 + 0i 開始,窮舉給定區間內的複數 C = a + bi,迭代 Z = Z * Z + C,迭代多少次使得 |Z| > 2,迭代次數將會由給定的字串依序塗色。

Sample Input

1
2
3
2
"#$&/|[]+;:-." -1.2 1.2 0.1 -2 1 0.05
"1234567890AB" -1.2 -0.8 0.02 -0.5 0.5 0.02

Sample Output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
########$$$$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&$$$$$$$$$$$$$$$$$$
#######$$$$$$$&&&&&&&&&&&&&&&&/////| +||///&&&&$$$$$$$$$$$$$$
######$$$$$&&&&&&&&&&&&&&&&//////||[]-;- |////&&&&$$$$$$$$$$$
#####$$$&&&&&&&&&&&&&&&&///////|||[+; -+[||////&&&&&$$$$$$$$
####$$&&&&&&&&&&&&&&&&///////||[[]+ +[||||//&&&&&&$$$$$$
###$$&&&&&&&&&&&&&&//////||[]++++;: :;+[[[ |//&&&&&$$$$$
##$$&&&&&&&&&&&&&////||||[[]. . |/&&&&&&$$$$
##$&&&&&&&&&&&//|||||||[[[+ . ][|/&&&&&&$$$
#$&&&&&&&///||].]]]]]]]]]+- ; |//&&&&&&$$
#&&&//////|||[]: . -;;- +[//&&&&&&&$
#&//////||||[]+- ]|///&&&&&&$
#/////[[[[]+. +[|///&&&&&&$
.+][|///&&&&&&&
#/////[[[[]+. +[|///&&&&&&$
#&//////||||[]+- ]|///&&&&&&$
#&&&//////|||[]: . -;;- +[//&&&&&&&$
#$&&&&&&&///||].]]]]]]]]]+- ; |//&&&&&&$$
##$&&&&&&&&&&&//|||||||[[[+ . ][|/&&&&&&$$$
##$$&&&&&&&&&&&&&////||||[[]. . |/&&&&&&$$$$
###$$&&&&&&&&&&&&&&//////||[]++++;: :;+[[[ |//&&&&&$$$$$
####$$&&&&&&&&&&&&&&&&///////||[[]+ +[||||//&&&&&&$$$$$$
#####$$$&&&&&&&&&&&&&&&&///////|||[+; -+[||////&&&&&$$$$$$$$
######$$$$$&&&&&&&&&&&&&&&&//////||[]-;- |////&&&&$$$$$$$$$$$
#######$$$$$$$&&&&&&&&&&&&&&&&/////| +||///&&&&$$$$$$$$$$$$$$
########$$$$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&$$$$$$$$$$$$$$$$$$
333333333333333333333333333333333222222222222222222
333333333333334444433333333333333332222222222222222
333333334444444444444444433333333333322222222222222
333334444444445555555444444433333333333222222222222
334444444444558866555554444444433333333332222222222
444444444445567 9B755555444444444333333333322222222
4444444444555678B9766555544444444433333333332222222
4444444445555668A0866666554444444444333333333322222
44444444555556670 A87667765444444444433333333332222
4444444555556667 08778A75544444444443333333333322
444444555555666790 99AA 6554444444444333333333332
444444555555667889 B A76654444444444433333333333
444445555555677889A A9876655444444444443333333333
444455555556677880A B09876655544444444444333333333
44455555556677889A A9877655554444444444433333333
4455555556677899 9887665555544444444443333333
4555555566789 0AB 0988765555554444444444333333
555555566680B AAB 866555555444444444433333
5555566667A B876555555554444444433333
55566666789AB A76655555555444444443333
566666677880B B977665555555554444444333

Solution

何等兇殘的題目,以前不少 testdata 是用 float 混用 double 產出來的結果,亦或者是輸出轉 float,各種神祕的方式才能恰好符號原本測資的誤差。
砸了許多混用方式才將那殘害世人的題目解決
-想到之前不少 float 拯救世界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 918 - ASCII Mandelbrot
// WTF for testdata, I used + 0.00000001f to pass it.
#include <stdio.h>
#include <math.h>
int main() {
int testcase;
double MINI, MAXI, MINR, MAXR, PRECI, PRECR;
char CHARS[128];
scanf("%d", &testcase);
while(testcase--) {
scanf("%s %lf %lf %lf %lf %lf %lf", CHARS, &MINI, &MAXI, &PRECI, &MINR, &MAXR, &PRECR);
CHARS[0] = CHARS[13] = ' ';
for(double a = MINI; a <= MAXI + 0.00000001f; a += PRECI) {
for(double b = MINR; b <= MAXR + 0.00000001f; b += PRECR) {
float za = 0, zb = 0, ca = b, cb = a, ta, tb;
int i;
for(i = 0; i < 12; i++) {
ta = za * za - zb * zb;
tb = 2 * za * zb;
za = ta + ca, zb = tb + cb;
if(za * za + zb * zb > 4)
break;
}
printf("%c", CHARS[i+1]);
}
puts("");
}
if(testcase)
puts("");
}
return 0;
}
/*
2
"#$&/|[]+;:-." -1.2 1.2 0.1 -2 1 0.05
"1234567890AB" -1.2 -0.8 0.02 -0.5 0.5 0.02
*/