SHOW:
|
|
- or go back to the newest paste.
1 | #include <iostream> | |
2 | #include <iomanip> | |
3 | #include <algorithm> | |
4 | ||
5 | using namespace std; | |
6 | ||
7 | // x >= y ? 1 : 0 | |
8 | int x_ge_y(const int x, const int y) | |
9 | { | |
10 | return abs(abs(x - y) - 1 - abs(y - x - 1)) / 2; | |
11 | } | |
12 | ||
13 | // x < y ? 1 : 0 | |
14 | int x_lt_y(const int x, const int y) | |
15 | { | |
16 | return 1 - x_ge_y(x, y); | |
17 | } | |
18 | ||
19 | int get_value(const int size, const int x, const int y) | |
20 | { | |
21 | //coords if point 0;0 is the center of the square | |
22 | const int x_centric = x - (size - 1) / 2; | |
23 | const int y_centric = y - (size - 1) / 2; | |
24 | ||
25 | //half-size and size of current sub-square | |
26 | const int current_subsquare_half = max(abs(x_centric), abs(y_centric)); | |
27 | const int current_subsquare = current_subsquare_half * 2 + 1; | |
28 | ||
29 | //coords local for current subsquare (0;0 is top-left) | |
30 | const int x_local = x_centric + current_subsquare_half; | |
31 | const int y_local = y_centric + current_subsquare_half; | |
32 | ||
33 | //top-right = top-right triangle, includes main diagonal; bottom-left = bottom-left triangle | |
34 | const int top_right_value = x_ge_y(x_local, y_local) * (x_local + y_local); | |
35 | const int bottom_left_value = x_lt_y(x_local, y_local) * (2 * (current_subsquare - 1) + ((current_subsquare - 1) - x_local) + ((current_subsquare - 1) - y_local)); | |
36 | ||
37 | //local sub-square value (point 0;0 contains value 0, proceed CW) | |
38 | const int inverted_value_local = top_right_value + bottom_left_value; | |
39 | //local sub-squre value, if we count from its center (center point contains 1) | |
40 | const int inverted_value = current_subsquare * current_subsquare - 1 - inverted_value_local; | |
41 | ||
42 | //proper final value | |
43 | return size * size - inverted_value; | |
44 | } | |
45 | ||
46 | int main() | |
47 | { | |
48 | cout << "------" << endl; | |
49 | ||
50 | const int size = 9; | |
51 | ||
52 | for (int i = 0; i < size; ++i) | |
53 | { | |
54 | for (int j = 0; j < size; ++j) | |
55 | { | |
56 | cout << setw(3) << get_value(size, j, i); | |
57 | }; | |
58 | cout << endl; | |
59 | }; | |
60 | ||
61 | cout << "------" << endl; | |
62 | return 0; | |
63 | } |