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