fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdint>
  4. #include <algorithm>
  5. #include <random>
  6. #include <tuple>
  7.  
  8. typedef std::vector<std::vector<std::uint64_t>>DType;
  9. typedef std::vector<std::int64_t> ivec;
  10.  
  11. static const std::uint64_t EmptyValue = 0;
  12.  
  13. std::tuple<std::uint64_t, std::uint64_t> FindEmpty(DType& D){
  14. for (std::size_t i = 0; i < D.size(); i++){
  15. for (std::size_t j = 0; j < D[i].size(); j++)
  16. {
  17. if (D[i][j] == EmptyValue){
  18. return std::make_tuple(j, i);
  19. }
  20. }
  21. }
  22. return std::make_tuple(3, 3);//ひどいバグだ。仕様通りなら到達しないパス。
  23. }
  24.  
  25.  
  26. DType MakeHoge(DType D, std::uint32_t Seed = 0,std::int32_t Suffle=48){
  27. ivec XP{ 0, 1, 0, -1 };
  28. ivec YP{ 1, 0, -1, 0 };
  29. std::uint64_t Dir = 0;
  30. std::int64_t X = 0;
  31. std::int64_t Y = 0;
  32. std::mt19937 mt(Seed);
  33. std::uniform_int_distribution<> uid(Suffle-Suffle/2, Suffle+Suffle/2);//最長手数-初期位置前回数-壁衝突回数
  34. std::uniform_int_distribution<> DR(0, 3);
  35. std::uint64_t R = uid(mt);
  36.  
  37. std::tie(X, Y) = FindEmpty(D);
  38.  
  39. for (std::size_t i = 0; i < R; i++){
  40. Dir = DR(mt);
  41. if (X + XP[Dir] < 0) continue;
  42. if (Y + YP[Dir] < 0) continue;
  43. if (X + XP[Dir] >= D[0].size()) continue;
  44. if (Y + YP[Dir] >= D.size()) continue;
  45.  
  46. std::swap(D[Y][X], D[Y + YP[Dir]][X + XP[Dir]]);
  47.  
  48. X += XP[Dir];
  49. Y += YP[Dir];
  50. }
  51. std::tie(X, Y) = FindEmpty(D);
  52. for (std::size_t i=X+1,j=X; i < D[0].size(); i++){
  53. std::swap(D[Y][j], D[Y][i]);
  54. j = i;
  55. }
  56. for (std::size_t i=Y+1,j=Y; i < D.size(); i++){
  57. std::swap(D[j][D[0].size()-1], D[i][D[0].size()-1]);
  58. j = i;
  59. }
  60. return D;
  61. }
  62.  
  63. bool Show(DType& D){
  64. for (auto& oo:D){
  65. for (auto& o:oo){
  66. if(o==EmptyValue){
  67. std::cout << 'E' << ' ';
  68. }else{
  69. std::cout<<o<<' ';
  70. }
  71. }
  72. std::cout << std::endl;
  73. }
  74. return true;
  75. }
  76.  
  77. int main(){
  78. DType D{ { 1, 2, 3, 4 },
  79. { 5, 6, 7, 8 },
  80. { 9, 10, 11, 12 },
  81. { 13, 14, 15,EmptyValue },
  82. };
  83.  
  84. D = MakeHoge(D);
  85. Show(D);
  86. std::cout << std::endl;
  87. D = MakeHoge(D,1);
  88. Show(D);
  89. std::cout << std::endl;
  90. D = MakeHoge(D,2);
  91. Show(D);
  92. std::cout << std::endl;
  93. D = MakeHoge(D,3);
  94. Show(D);
  95. std::cout << std::endl;
  96. D = MakeHoge(D,4);
  97. Show(D);
  98. std::cout << std::endl;
  99. return 0;
  100. }
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
2 3 4 7 
1 6 11 8 
5 13 10 12 
14 9 15 E 

2 3 4 7 
6 11 8 13 
1 5 9 12 
14 10 15 E 

2 3 7 8 
6 12 5 4 
1 11 13 15 
14 10 9 E 

2 3 7 8 
6 9 13 5 
1 12 11 4 
14 10 15 E 

3 6 7 8 
2 1 13 5 
12 9 11 4 
14 10 15 E