fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <tuple>
  4. #include <cstdint>
  5. #include <algorithm>
  6. #include <limits>
  7.  
  8. typedef std::tuple < std::uint32_t, std::uint32_t> Vec2;
  9. typedef std::vector<std::vector<std::uint32_t>> PType;
  10. typedef std::tuple<PType, std::uint32_t> RType;
  11.  
  12. static const std::uint32_t W = std::numeric_limits<std::uint32_t>::max();//てきとー。
  13. static const std::uint32_t F = W - 1;//テキトー。
  14.  
  15. bool Fill(PType& P,Vec2& V,std::uint32_t N){
  16. std::uint32_t A = 0, B = 0;
  17. std::uint32_t X = 0, Y = 0;
  18. std::vector<Vec2> Vec;
  19. std::vector<Vec2> Dir{ std::make_tuple(-1, -1), std::make_tuple(0, -1), std::make_tuple(1, -1), std::make_tuple(-1, 0), std::make_tuple(1, 0), std::make_tuple(-1, 1), std::make_tuple(0, 1), std::make_tuple(1, 1), };
  20.  
  21.  
  22. std::tie(A,B) = V;
  23. if (P[B][A] == F) Vec.push_back(std::make_tuple(A,B));
  24.  
  25. for (std::size_t i = 0; i < Vec.size(); i++){
  26. for (std::size_t j = 0; j < Dir.size(); j++){
  27. std::tie(X, Y) = Dir[j];
  28. std::tie(A, B) = Vec[i];
  29. if (Y + B >= P.size())continue;
  30. if (X + A >= P[Y + B].size())continue;
  31. if (P[Y + B][X + A] == W)continue;
  32. Vec2 T = std::make_tuple(X + A, Y + B);
  33. if (std::find(Vec.begin(), Vec.end(), T) != Vec.end()) continue;
  34. Vec.push_back(T);
  35. }
  36. }
  37.  
  38. for (auto& o : Vec){
  39. std::tie(X, Y) = o;
  40. P[Y][X] = N;
  41. }
  42.  
  43. return true;
  44. }
  45.  
  46. RType MakeHoge(PType P){
  47.  
  48. std::uint32_t N = 0;
  49.  
  50. for (std::size_t i = 0; i < P.size(); i++){
  51. for (std::size_t j = 0; j < P[i].size(); j++){
  52. if (P[i][j] == F){
  53. Vec2 v = std::make_tuple(j, i);
  54. Fill(P, v,N++);
  55. }
  56. }
  57. }
  58.  
  59. return std::make_tuple(P, N);
  60. }
  61.  
  62. bool Show(RType& R){
  63. PType P;
  64. std::uint64_t N;
  65.  
  66. std::tie(P, N) = R;
  67.  
  68. for (auto & oo : P){
  69. for (auto& o : oo){
  70. if (o == W)
  71. {
  72. std::cout << 'W';
  73. }
  74. else
  75. {
  76. std::cout << o;
  77. }
  78. }
  79. std::cout<<std::endl;
  80. }
  81. std::cout << N << " Room(s?)" << std::endl;
  82. return true;
  83. }
  84.  
  85. int main(){
  86. PType P = {
  87. { W, W, F, F, W, W },
  88. { W, F, W, W, W, F },
  89. { W, W, W, F, W, F },
  90. { F, F, F, W, W, W },
  91. };
  92.  
  93. auto R = MakeHoge(P);
  94. Show(R);
  95.  
  96. return 0;
  97. }
Success #stdin #stdout 0s 3280KB
stdin
Standard input is empty
stdout
WW00WW
W0WWW1
WWW2W1
222WWW
3 Room(s?)