Source code for submission s1030

fm.cpp

  1. #include <iostream>
  2. #include <cctype>
  3. #include <cmath>
  4. #include <complex>
  5. #include <string>
  6. #include <list>
  7. #include <map>
  8. #include <queue>
  9. #include <set>
  10. #include <sstream>
  11. #include <stack>
  12. #include <vector>
  13.  
  14. using namespace std;
  15.  
  16. #define DEBUG(x) cout << ">>> " #x << " : " << x << endl;
  17.  
  18.  
  19. int S(vector<vector < pair<int,int> > > & mapa,int c,int r,int tileR,int tileC,int sizeR,int sizeC)
  20. {
  21. int res=0;
  22. vector<vector<int> > tiles;
  23. tiles.resize((sizeR/tileR)+2);
  24. for(int i=0;i<tiles.size();++i)
  25. {
  26. tiles[i].resize((sizeC/tileC)+2);
  27. for(int j=0;j<tiles[i].size();++j)
  28. {
  29. tiles[i][j]=0;
  30. }
  31. }
  32.  
  33.  
  34. for(int i=0;i<mapa.size();i++)
  35. {
  36. for(int j=0;j<mapa[i].size();j++)
  37. {
  38. for(int k=mapa[i][j].first+c;k<mapa[i][j].second+c;k+=tileC)
  39. {
  40. tiles[(i+r)/tileR][k/tileC]=1;
  41. }
  42. tiles[(i+r)/tileR][(mapa[i][j].second+c)/tileC]=1;
  43. }
  44. }
  45.  
  46. for(int i=0;i<tiles.size();++i)
  47. {
  48. for(int j=0;j<tiles[i].size();++j)
  49. {
  50. res+=tiles[i][j];
  51. }
  52. }
  53. return res;
  54. }
  55.  
  56. int main() {
  57.  
  58. int sizeR,sizeC,tileR,tileC;
  59. while(std::cin>>sizeR>>sizeC>>tileR>>tileC)
  60. {
  61. vector<vector < pair<int,int> > > mapa;
  62. std::string line;
  63. for(int i=0;i<sizeR;++i)
  64. {
  65. std::cin >> line;
  66. char last='.';
  67. vector < pair<int,int> > v;
  68. mapa.push_back(v);
  69. int j=0;
  70. for (std::string::iterator pnter(line.begin()); pnter!=line.end(); ++pnter)
  71. {
  72. if(*pnter!=last && *pnter=='X')
  73. {
  74. mapa[i].push_back(pair<int,int>(j,0));
  75. }
  76. if(*pnter!=last && *pnter=='.')
  77. {
  78. mapa[i].back().second=j-1;
  79. //cout << mapa[i].back().first << " "<< mapa[i].back().second<< endl;
  80. }
  81. last=*pnter;
  82. j++;
  83.  
  84. }
  85. if(last=='X')
  86. {
  87. mapa[i].back().second=j-1;
  88. //cout << mapa[i].back().first << " "<< mapa[i].back().second<< endl;
  89. }
  90.  
  91. }
  92.  
  93. int res=1000000000;
  94. for(int r=0;r<tileR;++r)
  95. {
  96. for(int c=0;c<tileC;++c)
  97. {
  98.  
  99. res=min(res,S(mapa,c,r,tileR,tileC,sizeR,sizeC));
  100.  
  101. }
  102. }
  103. cout << res << endl;
  104.  
  105. }
  106. return 0;
  107. }
  108.