UVa Problem
Solution:
Solution:
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
bool comp_1(const pair<char, int>& a,
const pair<char, int>& b)
{
return a.first < b.first;
}
bool comp_2(const pair<char, int>& a,
const pair<char, int>& b)
{
return b.second < a.second;
}
class Problem
{
public:
Problem(const vector<vector<char> >& problemMap) :
mMap(problemMap)
{
}
vector<pair<char, int> > getSolution() const
{
return mHoles;
}
void solve()
{
for(int iRow = 0; iRow < mMap.size(); ++iRow)
{
for(int iCol = 0; iCol < mMap[0].size(); ++iCol)
{
if(mVisited.count(make_pair(iRow, iCol)) == 0)
{
if(mMap[iRow][iCol] != '.')
{
char character = mMap[iRow][iCol];
int holeSize = floodfill(iRow, iCol, character);
mHoles.push_back(make_pair(character, holeSize));
}
}
}
}
sort(mHoles.begin(), mHoles.end(), comp_1);
stable_sort(mHoles.begin(), mHoles.end(), comp_2);
}
private:
bool valid(int row, int col)
{
return row >= 0 && row < mMap.size() &&
col >= 0 && col < mMap[0].size();
}
int floodfill(int row, int col, char c)
{
int holeSize = 0;
if(valid(row, col) && mVisited.count(make_pair(row, col)) == 0)
{
if(mMap[row][col] == c)
{
++holeSize;
mVisited.insert(make_pair(row, col));
holeSize += floodfill(row+1, col, c);
holeSize += floodfill(row-1, col, c);
holeSize += floodfill(row, col+1, c);
holeSize += floodfill(row, col-1, c);
}
}
return holeSize;
}
private:
const vector<vector<char> >& mMap;
set<pair<int, int> > mVisited;
vector<pair<char, int> > mHoles;
};
int main(int argc, char *argv[])
{
int numRows, numCols;
int iProblem = 1;
while(cin >> numRows)
{
cin >> numCols;
if(numRows == 0 || numCols == 0)
break;
vector<vector<char> > problemMap(numRows);
for(int iRow = 0; iRow < numRows; ++iRow)
{
string strLine;
cin >> strLine;
for(int iCol = 0; iCol < numCols; ++iCol)
problemMap[iRow].push_back(strLine[iCol]);
}
Problem prob(problemMap);
prob.solve();
vector<pair<char, int> > sol = prob.getSolution();
cout << "Problem " << iProblem << ":" << endl;
for(int i = 0; i < sol.size(); ++i)
{
cout << sol[i].first << ' ' << sol[i].second << endl;
}
++iProblem;
}
return 0;
}
No comments:
Post a Comment