两块砖位置相同时不进行操作
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Blocks
{
public:
void ReadBlocks();
void ComputeBlocks();
void OutputResult();
private:
void moveBlocks(const int& iFrom, const int& iTo);
private:
int m_iNumber = 0;
vector<string> m_vecCommands;
vector<int> m_vecFrom;
vector<string> m_vecOperation;
vector<int> m_vecTo;
vector<vector<int>> m_vecBlocks;
vector<int> m_vecBlocksPosition;
};
void Blocks::ReadBlocks()
{
cin >> m_iNumber;
for (int i = 0; i < m_iNumber; ++i)
{
vector<int> vecNumber;
vecNumber.push_back(i);
m_vecBlocks.push_back(vecNumber);
m_vecBlocksPosition.push_back(i);
}
string strCommand;
while (true)
{
cin >> strCommand;
if (strCommand.compare("quit") == 0)
{
return;
}
m_vecCommands.push_back(strCommand);
int iNumber;
cin >> iNumber;
m_vecFrom.push_back(iNumber);
cin >> strCommand;
m_vecOperation.push_back(strCommand);
cin >> iNumber;
m_vecTo.push_back(iNumber);
}
}
void Blocks::moveBlocks(const int& iFrom, const int& iTo)
{
bool isMove = false;
for (auto it = m_vecBlocks[m_vecBlocksPosition[iFrom]].begin(); it != m_vecBlocks[m_vecBlocksPosition[iFrom]].end();)
{
if (isMove)
{
int iPosition = 0;
if (iTo == -1)
{
iPosition = *it;
}
else
{
iPosition = m_vecBlocksPosition[iTo];
}
m_vecBlocksPosition[*it] = iPosition;
m_vecBlocks[iPosition].push_back(*it);
it = m_vecBlocks[m_vecBlocksPosition[iFrom]].erase(it);
}
else
{
if (*it == iFrom)
{
isMove = true;
if (iTo != -1)
{
m_vecBlocks[m_vecBlocksPosition[iTo]].push_back(iFrom);
it = m_vecBlocks[m_vecBlocksPosition[iFrom]].erase(it);
continue;
}
}
++it;
}
}
if (iTo != -1)
{
m_vecBlocksPosition[iFrom] = m_vecBlocksPosition[iTo];
}
}
void Blocks::ComputeBlocks()
{
for (size_t i = 0; i < m_vecCommands.size(); ++i)
{
if (m_vecBlocksPosition[m_vecFrom[i]] != m_vecBlocksPosition[m_vecTo[i]])
{
if (m_vecCommands[i].compare("move") == 0)
{
if (m_vecOperation[i].compare("onto") == 0)
{
this->moveBlocks(m_vecTo[i], -1);
this->moveBlocks(m_vecFrom[i], m_vecTo[i]);
}
else if (m_vecOperation[i].compare("over") == 0)
{
this->moveBlocks(m_vecFrom[i], m_vecTo[i]);
}
}
else if (m_vecCommands[i].compare("pile") == 0)
{
if (m_vecOperation[i].compare("onto") == 0)
{
this->moveBlocks(m_vecTo[i], -1);
this->moveBlocks(m_vecFrom[i], m_vecTo[i]);
}
else if (m_vecOperation[i].compare("over") == 0)
{
this->moveBlocks(m_vecFrom[i], m_vecTo[i]);
}
}
}
}
}
void Blocks::OutputResult()
{
for (size_t i = 0; i < m_vecBlocks.size(); ++i)
{
cout << i << ":";
for (auto it : m_vecBlocks[i])
{
cout << " " << it;
}
cout << endl;
}
}
int main()
{
Blocks blocks;
blocks.ReadBlocks();
blocks.ComputeBlocks();
blocks.OutputResult();
return 0;
}