#include <iostream>
#include <math.h>
#include <tuple>
#include <utility>
#include <vector>
constexpr int len = 10;
// black is true, white is false;
#define BLACK (true)
#define WHITE (false)
using COLOR = bool;
COLOR panes[len][len] = {WHITE};
int history[len][len] = {0};
inline bool calculatedBefore(int i, int j) {
if (history[i][j] > 0 ) {
return true;
} else {
return false;
}
}
inline bool passedBefore(bool * roadpass, int i, int j) {
if (roadpass[i*len + j] == true) {
return true;
}
return false;
}
int calculate_node(int i, int j, bool * roadpass, COLOR color, std::vector<std::pair<int, int>> & vec) {
if (i < 0 || i >= len || j < 0 || j >= len) {
return 0;
}
if (passedBefore(roadpass, i, j)) {
return 0;
}
roadpass[i*len+j] = true;
COLOR mycolor = panes[i][j];
if(mycolor != color) {
return 0;
}
vec.push_back({i,j});
auto left = calculate_node(i-1, j, roadpass, color, vec);
auto right = calculate_node(i+1, j, roadpass, color, vec);
auto top = calculate_node(i, j-1, roadpass, color, vec);
auto bottom = calculate_node(i, j+1, roadpass, color, vec);
return 1+left+right+top+bottom;
}
void addHistory(std::vector<std::pair<int, int>> & vec, int num) {
for(auto &item : vec) {
assert(history[item.first][item.second] == 0);
history[item.first][item.second] = num;
}
}
std::tuple<int, bool> calculate() {
int max = 0;
COLOR color = WHITE;
std::vector<std::pair<int, int>> vec;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (calculatedBefore(i, j)) continue;
bool roadpass[len][len] = {false};
vec.clear();
auto blacknum = calculate_node(i, j, &roadpass[0][0], BLACK, vec);
addHistory(vec, blacknum);
vec.clear();
bool roadpass_w[len][len] = {false};
auto whitenum = calculate_node(i, j, &roadpass_w[0][0], WHITE, vec);
addHistory(vec, whitenum);
if (max < blacknum) {
max = blacknum;
color = BLACK;
}
if (max < whitenum) {
max = whitenum;
color = WHITE;
}
}
}
return std::make_tuple(max, color);
}
void genpanes() {
for (int i =0; i < len; i++)
for (int j =0; j < len; j++) {
if (i == j) {
panes[i][j] = BLACK;
}
if (i == (len-1-j)) {
panes[i][j] = BLACK;
}
}
}
void printhistory() {
std::cout << "history" << std::endl;
for (int i = 0; i < len; i++) {
for (int j =0; j < len; j++) {
std::cout << history[i][j] << " ";
}
std::cout << std::endl;
}
}
void printpanes() {
std::cout << "panes" << std::endl;
for (int i = 0; i < len; i++) {
for (int j =0; j < len; j++) {
std::cout << panes[i][j] << " ";
}
std::cout << std::endl;
}
}
int main() {
genpanes();
auto [num, color] = calculate();
std::cout << "color = " << color << ", num = " << num << std::endl;
printpanes();
printhistory();
return 0;
}
结果:
color = 0, num = 20
panes
1 0 0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 0 0 1 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 1 0 0 1 0 0 0
0 0 1 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 0 1
history
1 20 20 20 20 20 20 20 20 1
20 1 20 20 20 20 20 20 1 20
20 20 1 20 20 20 20 1 20 20
20 20 20 1 20 20 1 20 20 20
20 20 20 20 4 4 20 20 20 20
20 20 20 20 4 4 20 20 20 20
20 20 20 1 20 20 1 20 20 20
20 20 1 20 20 20 20 1 20 20
20 1 20 20 20 20 20 20 1 20
1 20 20 20 20 20 20 20 20 1