Untitled

 avatar
unknown
c_cpp
a year ago
10 kB
7
Indexable
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <tuple>
#include <string>

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;
    }
}

map< int, string > getDiagonals(const vector<char>& board)
{
    map< int, string > diagonals;
    int key = 1;
    int underHalfBoard = 0;

    int boardSize = calculate_board_size(board);
    int row = 0;
    int middleRow = boardSize;

    for (unsigned int i = 0; i < board.size(); ++i)
    {
        if (board[i] == '-')
        {
            continue;
        }
        else if (board[i] == '\n')
        {
            ++row;
            if (row <= middleRow)
            {
                key = 1;
            }
            else
            {
                ++underHalfBoard;
                key = 1 + underHalfBoard;
            }
        }
        else if (board[i] == '<')
        {
            if (board[i + 2] == 'r' or board[i + 2] == 'b')
            {
                diagonals[key] += board[i + 2];
            }
            else if (board[i + 2] == ' ')
            {
                diagonals[key] += 'x'; // zamiast spacji wstawiamy znak x
            }
            ++key;
            i += 4;
        }
    }

    // Kontrolne wypisanie
//    for( const auto& element : diagonals )
//    {
//        cout << element.first << " -> " << element.second << endl;
//    }

    return diagonals;
}

bool hasBluePath(vector<vector<char>>& board) {
    size_t rows = board.size();
    size_t cols = board[0].size();

    // Tworzymy kolejkę do przechowywania współrzędnych
    queue< tuple< int, int > > q;

    // Rozpoczynamy od wszystkich komórek w pierwszej kolumnie, które mają wartość 'b'
    for (int i = 0; i < rows; ++i) {
        if (board[i][0] == 'b') {
            q.emplace(i, 0);
        }
    }

    // Tablica do śledzenia odwiedzonych komórek
    vector<vector<bool>> visited(rows, vector<bool>(cols, false));

    while (!q.empty()) {
        auto [x, y] = q.front();
        q.pop();

        // Jeśli dotarliśmy do prawej kolumny, zwracamy true
        if (y == cols - 1) {
            return true;
        }

        // Sprawdzamy możliwe ruchy: lewo, prawo, góra, dół, lewy górny skos, prawy dolny skos
        int dx[] = { 0, 0, -1, 1, -1, 1 };
        int dy[] = { -1, 1, 0, 0, -1, 1 };
        for (int i = 0; i < 6; ++i) {
            int new_x = x + dx[i];
            int new_y = y + dy[i];
            if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols &&
                !visited[new_x][new_y] && board[new_x][new_y] == 'b') {
                visited[new_x][new_y] = true;
                q.emplace(new_x, new_y);
            }
        }
    }

    return false;
}

bool hasRedPath(vector< vector< char > >& board)
{
    size_t rows = board.size();
    size_t cols = board[0].size();

    queue< tuple< int, int > > q;

    // Rozpoczynamy od pierwszej kolumny
    for (int j = 0; j < cols; ++j)
    {
        if (board[0][j] == 'r')
        {
            q.emplace(0, j);
        }
    }

    // Tablica do śledzenia odwiedzonych komórek
    vector< vector< bool > > visited(rows, vector< bool >(cols, false));

    while (!q.empty())
    {
        auto [x, y] = q.front();
        q.pop();

        // Jeśli dotarliśmy do ostatniego wiersza, zwracamy true
        if (x == rows - 1)
        {
            return true;
        }

        // Sprawdzamy wszystkie możliwe ruchy w dół i w bok
        // Sprawdzamy możliwe ruchy: lewo, prawo, góra, dół, lewy górny skos, prawy dolny skos
        int dx[] = { 0, 0, -1, 1, -1, 1 };
        int dy[] = { -1, 1, 0, 0, -1, 1 };
        for (int i = 0; i < 6; ++i) {
            int new_x = x + dx[i];
            int new_y = y + dy[i];
            if (new_x >= 0 && new_x < rows && new_y >= 0 && new_y < cols &&
                !visited[new_x][new_y] && board[new_x][new_y] == 'r') {
                visited[new_x][new_y] = true;
                q.emplace(new_x, new_y);
            }
        }
    }

    return false;
}
int is_game_over(const vector<char>& board)
{
    map< int, string > diagonals = getDiagonals(board);

    vector< vector< char > > board2D;
    for (const auto& element : diagonals)
    {
        vector< char > pawns;
        for (const auto& s : element.second)
        {
            pawns.push_back(s);
        }
        board2D.push_back(pawns);
    }

    // Kontrolne wypisanie
    /*for (const auto& element : board2D)
    {
        for (const auto& e : element)
        {
            cout << e << " ";
        }
        cout << endl;
    }*/

    /* 1-czerwone 2-niebieskie 3-żaden */
    if (hasBluePath(board2D))
    {
        return 2;
    }

    if (hasRedPath(board2D))
    {
        return 1;
    }

    return 3;
}


int Answer(const string& question)
{
    if (question == "OARD_SIZE")
    {
        return 1;
    }
    else if (question == "AWNS_NUMBER")
    {
        return 2;
    }
    else if (question == "S_BOARD_CORRECT")
    {
        return 3;
    }
    else if (question == "S_GAME_OVER")
    {
        return 4;
    }
    else
    {
        return 5;
    }
}

int main()
{
    vector< char > board;
    string question;
    char cell;

    while( true )
    {
        while( cin.get( cell ) && cell != 'I' && cell != 'B' && cell != 'P' )
        {
            board.push_back( cell );
        }

        // Sprawdź, czy wczytywanie zakończyło się z powodu końca pliku (EOF)
        if (cin.eof())
        {
            // Zakończ pętlę, jeśli osiągnięto koniec pliku
            break;
        }
        else if (cin.fail())
        {
            // Obsługa niepowodzenia wczytywania danych
            cerr << "Błąd wczytywania danych." << endl;
            break; // Przerwij pętlę w przypadku błędu wczytywania
        }
        
        getline(cin, question);

        int calculated_size = calculate_board_size( board );
        int calculated_pawns = calculate_pawns_number( board );
        int game_result = is_game_over( board );

        if( Answer( question ) == 1 )
        {
            cout << calculated_size << endl;
        }
        else if( Answer( question ) == 2 )
        {
            cout << calculated_pawns << endl;
        }
        else if( Answer( question ) == 3 )
        {
            if( is_board_correct( board ) == 1 )
            {
                cout << "NO" << endl;
            }
            else
            {
                cout << "YES" << endl;
            }
        }
        else if( Answer( question ) == 4 )
        {
            if( game_result == 1 )
            {
                cout << "YES RED" << endl;
            }
            else if( game_result == 2 )
            {
                cout << "YES BLUE" << endl;
            }
            else
            {
                cout << "NO" << endl;
            }
        }
//        else if (Answer(question) == 5)
//        {
//            int game_result = is_game_over(board);
//            if (game_result == 3 && is_board_correct(board) == 1)
//            {
//                cout << "NO" << endl;
//            }
//            else if (game_result == 3 && is_board_correct(board) == 2)
//            {
//                cout << "YES" << endl;
//            }
//            else if (game_result == 1)
//            {
//                int red_number = 0;
//                int blue_number = 0;
//                for (char b : board) {
//                    if (b == 'r') {
//                        red_number++;
//                    }
//                    else if (b == 'b') {
//                        blue_number++;
//                    }
//                }
//                if (red_number == blue_number + 1)
//                {
//                    cout << "YES" << endl;
//                }
//                else
//                {
//                    cout << "NO" << endl;
//                }
//            }
//            else if (game_result == 2)
//            {
//                int red_number = 0;
//                int blue_number = 0;
//                for (char b : board) {
//                    if (b == 'r') {
//                        red_number++;
//                    }
//                    else if (b == 'b') {
//                        blue_number++;
//                    }
//                }
//                if (red_number == blue_number)
//                {
//                    cout << "YES" << endl;
//                }
//                else
//                {
//                    cout << "NO" << endl;
//                }
//            }
//        }

        question.clear();
        board.clear();
    }

    return 0;
}
Editor is loading...
Leave a Comment