Untitled
unknown
c_cpp
a year ago
4.5 kB
4
Indexable
#include <iostream> #include <vector> using namespace std; int calculate_board_size(const vector<char>& board) { int max_width = 0; int current_width = 0; for (char cell : board) { if (cell == '<') { current_width++; } else if (cell == '\n') { if (current_width > max_width) { max_width = current_width; } current_width = 0; } } return max_width; } int calculate_pawns_number(const vector<char>& board) { int red_number = 0; int blue_number = 0; for (char cell : board) { if (cell == 'r') { red_number++; } else if (cell == 'b') { blue_number++; } } return red_number + blue_number; } int is_board_correct(const vector<char>& board) { int red_number = 0; int blue_number = 0; for (char cell : board) { if (cell == 'r') { red_number++; } else if (cell == 'b') { blue_number++; } } if (blue_number > red_number) { return 1; } else if (red_number > blue_number + 1) { return 1; } else { return 2; } } vector< int > get_neighbors( const vector< char >& board, int current, int boardSize ) { vector< int > neighbors; int up = current - boardSize - 1; int down = current + boardSize + 1; int left = current - 1; int right = current + 1; int up_left = current - boardSize; int down_right = current + boardSize; if (up >= 0 && up % (boardSize + 1) != boardSize - 1) { neighbors.push_back(up); } if (down < board.size() && down % (boardSize + 1) != 0) { neighbors.push_back(down); } if (left >= 0 && left % (boardSize + 1) != boardSize - 1) { neighbors.push_back(left); } if (right < board.size() && right % (boardSize + 1) != 0) { neighbors.push_back(right); } if (up_left >= 0 && up_left % (boardSize + 1) != boardSize - 1) { neighbors.push_back(up_left); } if (down_right < board.size() && down_right % (boardSize + 1) != 0) { neighbors.push_back(down_right); } return neighbors; } bool dfs( const vector< char >& board, int current, vector< bool >& visited, int boardSize, char color) { visited[ current ] = true; if( ( color == 'r' && current % (boardSize + 1) == boardSize - 1 ) || ( color == 'b' && current / (boardSize + 1) == boardSize - 1 ) ) { return true; } vector<int> neighbors = get_neighbors(board, current, boardSize); for (int neighbor : neighbors) { if (!visited[neighbor] && board[neighbor] == color) { if (dfs(board, neighbor, visited, boardSize, color)) { return true; } } } return false; } int is_game_over(const vector<char>& board) { int boardSize = calculate_board_size(board); /* 1-czerwone 2-niebieskie 3-żaden */ vector<bool> visited(board.size(), false); for (int i = 0; i < boardSize; ++i) { if (board[i] == 'r' && !visited[i]) { if (dfs(board, i, visited, boardSize, 'r')) { return 1; } } } visited.assign(board.size(), false); for (int i = 0; i < board.size(); ++i) { if (board[i] == 'b' && !visited[i]) { if (dfs(board, i, visited, boardSize, 'b')) { return 2; } } } return 3; } int main() { vector<char> board; char cell; while (cin.get(cell) && cell != 'I') { board.push_back(cell); } int calculated_size = calculate_board_size(board); int calculated_pawns = calculate_pawns_number(board); cout << calculated_size << endl << " " << endl; cout << calculated_pawns << endl << " " << endl; if (is_board_correct(board) == 1) { cout << "NO" << endl << " " << endl; } else { cout << "YES" << endl << " " << endl; } int game_result = is_game_over(board); if (game_result == 1) { cout << "YES RED" << endl << " " << endl; } else if (game_result == 2) { cout << "YES BLUE" << endl << " " << endl; } else { cout << "NO" << endl << " " << endl; } return 0; }
Editor is loading...
Leave a Comment