fork download
  1. import java.util.Arrays;
  2.  
  3. /*
  4. プログラミングのお題スレ Part15
  5. //mevius.5ch.net/test/read.cgi/tech/1564310397/137
  6.  
  7. 137 名前:さまよえる蟻人間 ◆T6xkBnTXz7B0 [sage] 投稿日:2019/08/17(土) 15:58:34.13 ID:hkO+8710
  8. お題: オカダンゴムシには進行中に壁にぶつかると左へ、次は右へ(あるいは右へ、次は左へ)と交互に曲がっていく習性がある。この行動は「交替性転向反応」といい、左右に交互に曲がる事で天敵から逃げられる確率を高めているといわれている(ウィキペディアより引用)。
  9.  
  10. 何もない整数平面上にスタート地点(S)とゴール地点(G)が与えられる。仮想ダンゴムシ(@)の周辺に壁(#)をいくつか作って、スタート地点からゴール地点まで誘導せよ。
  11. ただし、ダンゴムシは最初は右向きを向いていて、最初にぶつかったら左に曲がるものとする。
  12. 90度曲がって目の前にすぐに壁がある場合は同じ方へもう90度曲がるものとする。壁はいくつ作ってもよい。
  13.  
  14. 例) S=(0, 0), G=(5, 2)
  15. →#={(6, 0)}.
  16. 例) S=(1, 2), G=(-1, 1)
  17. →#={(2, 2), (1, 3), (0, 2), (1, 0)}.
  18.  */
  19. class Ideone
  20. {
  21. private static final Point[] EMPTY = new Point[0];
  22.  
  23. public static void main(String[] args)
  24. {
  25. solve(new Point(1,1), new Point(5,1));
  26. solve(new Point(1,1), new Point(5,5));
  27. solve(new Point(1,1), new Point(1,5));
  28. solve(new Point(1,1), new Point(-5,5));
  29. solve(new Point(1,1), new Point(-5,1));
  30. solve(new Point(1,1), new Point(-5,-5));
  31. solve(new Point(1,1), new Point(1,-5));
  32. solve(new Point(1,1), new Point(5,-5));
  33. }
  34.  
  35. static void solve(Point s, Point g)
  36. {
  37. Point[] wall = wall(s, g);
  38. System.out.printf("S:%s G:%s Wall:%s X:(0,0)%n", s, g, Arrays.toString(wall));
  39. System.out.println("--------------------");
  40. int minX = Math.min(0, Math.min(s.x, g.x));
  41. int minY = Math.min(0, Math.min(s.y, g.y));
  42. int maxX = Math.max(0, Math.max(s.x, g.x));
  43. int maxY = Math.max(0, Math.max(s.y, g.y));
  44. for (Point p : wall)
  45. {
  46. minX = Math.min(minX, p.x);
  47. minY = Math.min(minY, p.y);
  48. maxX = Math.max(maxX, p.x);
  49. maxY = Math.max(maxY, p.y);
  50. }
  51.  
  52. char[][] cs = new char[maxY - minY + 1][maxX - minX + 1];
  53. for (int i = 0; i < cs.length; i++) Arrays.fill(cs[i], ' ');
  54. cs[-minY][-minX] = 'X';
  55. cs[s.y - minY][s.x - minX] = 'S';
  56. cs[g.y - minY][g.x - minX] = 'G';
  57. for (Point p : wall)
  58. {
  59. cs[p.y - minY][p.x - minX] = '#';
  60. }
  61. for (int i = cs.length-1; i >= 0; i--)
  62. System.out.println(cs[i]);
  63. System.out.println("////////////////////");
  64. }
  65.  
  66. // 壁を作るところ
  67. static Point[] wall(Point s, Point g)
  68. {
  69. int dx = g.x - s.x;
  70. int dy = g.y - s.y;
  71.  
  72. if (dx >= 0)
  73. {
  74. if (dy == 0) return points();
  75. if (dy > 0) return points(g.x + 1, s.y);
  76. return points(g.x + 1, s.y, g.x, s.y + 2, g.x + 1, s.y + 1);
  77. }
  78.  
  79. if (dy == 0) return points(s.x + 1, s.y, s.x, s.y + 1);
  80. if (dy > 0) return points(s.x + 1, s.y, s.x, s.y + 1, g.x - 1, s.y);
  81. return points(s.x + 1, s.y, s.x, s.y + 1, s.x - 1, s.y, s.x, g.y - 1);
  82. }
  83.  
  84.  
  85. static Point[] points(int...coodinate)
  86. {
  87. Point[] points = new Point[coodinate.length / 2];
  88. for (int i = 0; i < points.length; i++)
  89. points[i] = new Point(coodinate[i * 2], coodinate[i * 2 + 1]);
  90. return points;
  91. }
  92.  
  93. static class Point
  94. {
  95. int x, y;
  96.  
  97. Point(int x, int y)
  98. {
  99. this.x = x;
  100. this.y = y;
  101. }
  102.  
  103. @Override
  104. public String toString()
  105. {
  106. return "(" + x + "," + y + ")";
  107. }
  108. }
  109. }
  110.  
Success #stdin #stdout 0.13s 36916KB
stdin
Standard input is empty
stdout
S:(1,1) G:(5,1) Wall:[] X:(0,0)
--------------------
 S   G
X     
////////////////////
S:(1,1) G:(5,5) Wall:[(6,1)] X:(0,0)
--------------------
     G 
       
       
       
 S    #
X      
////////////////////
S:(1,1) G:(1,5) Wall:[(2,1)] X:(0,0)
--------------------
 G 
   
   
   
 S#
X  
////////////////////
S:(1,1) G:(-5,5) Wall:[(2,1), (1,2), (-6,1)] X:(0,0)
--------------------
 G       
         
         
       # 
#      S#
      X  
////////////////////
S:(1,1) G:(-5,1) Wall:[(2,1), (1,2)] X:(0,0)
--------------------
      # 
G     S#
     X  
////////////////////
S:(1,1) G:(-5,-5) Wall:[(2,1), (1,2), (0,1), (1,-6)] X:(0,0)
--------------------
      # 
     #S#
     X  
        
        
        
        
G       
      # 
////////////////////
S:(1,1) G:(1,-5) Wall:[(2,1), (1,3), (2,2)] X:(0,0)
--------------------
 # 
  #
 S#
X  
   
   
   
   
 G 
////////////////////
S:(1,1) G:(5,-5) Wall:[(6,1), (5,3), (6,2)] X:(0,0)
--------------------
     # 
      #
 S    #
X      
       
       
       
       
     G 
////////////////////