nnc.cpp (2901B)
1 #include <algorithm> 2 #include <cmath> 3 #include <cstdlib> 4 #include <ctime> 5 #include <vector> 6 #include <curses.h> 7 8 static int ymax() 9 { 10 return getmaxy(stdscr); 11 } 12 13 static int xmax() 14 { 15 return getmaxx(stdscr); 16 } 17 18 struct Color { 19 int x, y; 20 int color; 21 22 Color(int x, int y, int color) 23 :x(x), y(y), color(color) {} 24 25 int dist(const Color& c) 26 { 27 int dx = this->x - c.x; 28 int dy = this->y - c.y; 29 30 return std::sqrt(dx * dx + dy * dy); 31 } 32 }; 33 34 struct Blue: public Color { 35 Blue(int x, int y, int color) 36 :Color(x, y, color) {} 37 }; 38 39 struct Green: public Color { 40 Green(int x, int y, int color) 41 :Color(x, y, color) {} 42 }; 43 44 struct White: public Color { 45 White(int x, int y, int color) 46 :Color(x, y, color) {} 47 }; 48 49 static void 50 cursesinit() 51 { 52 if (!initscr()) 53 exit(1); 54 cbreak(); 55 noecho(); 56 curs_set(0); 57 start_color(); 58 init_pair(1, COLOR_BLUE, COLOR_BLUE); 59 init_pair(2, COLOR_GREEN, COLOR_GREEN); 60 init_pair(3, COLOR_WHITE, COLOR_WHITE); 61 } 62 63 static void 64 makepts(std::vector<Color *>& points) 65 { 66 int x, y; 67 68 for (std::size_t i = 0; i < 5; i++) { 69 x = std::rand() % (xmax() - 1); 70 y = std::rand() % (ymax() - 1); 71 points.push_back(new Blue(x, y, 1)); 72 } 73 for (std::size_t i = 0; i < 5; i++) { 74 x = std::rand() % (xmax() - 1); 75 y = std::rand() % (ymax() - 1); 76 points.push_back(new Green(x, y, 2)); 77 } 78 } 79 80 static void 81 makewts(std::vector<White *>& whites) 82 { 83 int x, y; 84 85 for (std::size_t i = 0; i < 5; i++) { 86 x = std::rand() % (xmax() - 1); 87 y = std::rand() % (ymax() - 1); 88 whites.push_back(new White(x, y, 3)); 89 } 90 } 91 92 template<typename T> static void 93 print(const std::vector<T *>& vec) 94 { 95 for (auto& v : vec) { 96 attron(COLOR_PAIR(v->color)); 97 mvaddch(v->y, v->x, ACS_CKBOARD); 98 attroff(COLOR_PAIR(v->color)); 99 } 100 } 101 102 static std::vector<int> 103 calc_dists(const std::vector<Color *>& points, const White& w) 104 { 105 std::vector<int> dists; 106 107 for (auto& point : points) 108 dists.push_back(point->dist(w)); 109 return dists; 110 } 111 112 static void 113 find_nn(const std::vector<Color *>& points, std::vector<White *>& whites) 114 { 115 std::vector<int> dists; 116 int mindist; 117 118 for (const auto& point : points) { 119 for (auto&& white : whites) { 120 dists = calc_dists(points, *white); 121 mindist = *std::min_element(dists.begin(), dists.end()); 122 if (point->dist(*white) == mindist) 123 white->color = point->color; 124 } 125 } 126 } 127 128 template<typename T> static void 129 dealloc(std::vector<T *>& vec) 130 { 131 for (auto&& v : vec) 132 if (v != nullptr) 133 delete v; 134 if (!vec.empty()) 135 vec.clear(); 136 } 137 138 int 139 main(int argc, char **argv) 140 { 141 std::vector<Color *> points; 142 std::vector<White *> whites; 143 144 cursesinit(); 145 std::srand(std::time(nullptr)); 146 147 makepts(points); 148 makewts(whites); 149 150 erase(); 151 print<Color>(points); 152 print<White>(whites); 153 refresh(); 154 getch(); 155 156 find_nn(points, whites); 157 158 erase(); 159 print<Color>(points); 160 print<White>(whites); 161 refresh(); 162 getch(); 163 164 endwin(); 165 dealloc<Color>(points); 166 dealloc<White>(whites); 167 168 return 0; 169 }