Cod sursă (job #484896)

Utilizator avatar mirceatlx Lica Mircea Tudor mirceatlx IP ascuns
Problemă Domino Compilator cpp | 2,74 kb
Rundă Arhiva de probleme Status evaluat
Dată 3 sept. 2019 05:33:00 Scor 56
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <bitset>
#include <vector>
#define maxSize 10005
using namespace std;

ifstream fin("domino.in");
ofstream fout("domino.out");

struct pieceInformation{

    int piecePosition, first, second;
};

int pieceNumber, eliminateNumber, rotateNumber;
bitset <maxSize> setCheckTrue;
stack < pieceInformation > st;
vector < pieceInformation > pieceList(maxSize);

void basicOperations()
{
    setCheckTrue[st.top().piecePosition] = 1;
    st.pop();
    eliminateNumber--;
}

void eliminiatePieces()
{
    int firstElement, secondElement;
    bool condition;
    st.push(pieceList[1]);
    for(int i = 2 ; i <= pieceNumber; i++)
    {
        condition = true;
        while(!st.empty() && eliminateNumber > 0 && condition)
        {
            condition = false;
            firstElement = st.top().first;
            secondElement = st.top().second;
            if(pieceList[i].first > firstElement && pieceList[i].first > secondElement)
            {
                basicOperations();
                condition = true;
                continue;
            }
            if(pieceList[i].second > firstElement && pieceList[i].second > secondElement)
            {
                basicOperations();
                condition = true;
                continue;
            }
            if(pieceList[i].first == firstElement && pieceList[i].second == secondElement)
            {
                basicOperations();
                condition = true;
                continue;
            }
            if(pieceList[i].first == secondElement && pieceList[i].second == firstElement && firstElement < pieceList[i].first)
            {
                basicOperations();
                condition = true;
                continue;
            }
        }
        st.push(pieceList[i]);
    }
}

void rotatePieces()
{
    
    for(int i = 1; i <= pieceNumber && rotateNumber ; i++)
    {
        if(pieceList[i].second > pieceList[i].first && setCheckTrue[i] == 0)
        {
            swap(pieceList[i].first,pieceList[i].second);
            rotateNumber--;
        }
           
    }
}
int main()
{
    int piecePart1, piecePart2;
    fin >> pieceNumber >> rotateNumber >> eliminateNumber;
    for(int i = 1 ; i <= pieceNumber ; i ++)
    {
        fin >> piecePart1 >> piecePart2;
        pieceList[i] = {i,piecePart1,piecePart2};
    }
    eliminiatePieces();
    /*for(int i = 1; i <= pieceNumber; i++)
        cout << setCheckTrue[i] << " ";*/
    rotatePieces();
    for(int i = 1 ; i <= pieceNumber ; i++)
        if(setCheckTrue[i] == 0)
            fout << pieceList[i].first << pieceList[i].second;
    return 0;
}