fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. //результат - это кто победил + на каком ходу
  8. typedef std::pair<int, double> Result;
  9.  
  10. //список результатов (не list из-за сраной сортировки)
  11. std::vector<Result> endings;
  12.  
  13. //добавить результат в список (если его там еще нет)
  14. void addResult(const Result& result){
  15. if (std::find(endings.begin(), endings.end(), result) == endings.end()){
  16. endings.push_back(result);
  17. }
  18. }
  19.  
  20. void turn(int n, char pawn_x, char pawn_y, char pony_x, char pony_y){
  21. //если ходит пешка(белые)
  22. if (n % 2 != 0) {
  23. //если пешка стала ферзем
  24. if (pawn_y == '8')
  25. {
  26. //зафиксировать победу белых
  27. addResult(Result(n, 1));
  28. return;
  29. }
  30.  
  31.  
  32. //если пешке преграждают путь
  33. if ((pawn_x == pony_x) && (pawn_y+1 == pony_y)){
  34. //зафиксировать ничью
  35. addResult(Result(n, 0.5));
  36. return;
  37. }
  38.  
  39. //если пешка может побить коня
  40. if ((pawn_y+1==pony_y)&&((pawn_x+1==pony_x)||(pawn_x-1==pony_x))){
  41. //поебда белых
  42. addResult(Result(n, 1));
  43. return;
  44. }
  45.  
  46. //иначе - походить
  47. return turn(n+1, pawn_x, pawn_y+1, pony_x, pony_y);
  48. }
  49.  
  50.  
  51. //если ходит пони(черные)
  52. else {
  53. char pony_turns[8][2] = {
  54. {(char)(pony_x-1), (char)(pony_y-2)},
  55. {(char)(pony_x-2), (char)(pony_y-1)},
  56. {(char)(pony_x-1), (char)(pony_y+2)},
  57. {(char)(pony_x-2), (char)(pony_y+1)},
  58. {(char)(pony_x+1), (char)(pony_y+2)},
  59. {(char)(pony_x+2), (char)(pony_y+1)},
  60. {(char)(pony_x+1), (char)(pony_y-2)},
  61. {(char)(pony_x+2), (char)(pony_y-1)}
  62. };
  63.  
  64. for (int i=0; i<8; ++i) {
  65. //если конь может побить пешку
  66. if ((pony_turns[i][0] == pawn_x) && (pony_turns[i][1] == pawn_y)){
  67. addResult(Result(n, -1));
  68. return;
  69. }
  70. // а если не может, но ход в пределах шахматной доски
  71. else if ((pony_turns[i][0] <= 'h') && (pony_turns[i][0] >= 'a') && (pony_turns[i][1] <= '8') && (pony_turns[i][1] >= '1')){
  72. //и если на следующем ходу пешка ее не побьет
  73. if (!((pony_turns[i][1] == pawn_y+1) && ((pony_turns[i][0] == pawn_x+1) || (pony_turns[i][0] == pawn_x-1)))){
  74. turn(n + 1, pawn_x, pawn_y, pony_turns[i][0], pony_turns[i][1]);
  75. }
  76. }
  77. }
  78. }
  79. }
  80.  
  81. int main()
  82. {
  83. string pawn;
  84. string pony;
  85.  
  86. cin >> pawn;
  87. cin >> pony;
  88.  
  89.  
  90. //если хитровыебанная позиция, с которой у пешки есть выбор:
  91. if (pawn[1] == '2'){
  92. // если пешке прегражден путь
  93. if ((pony[1] == '3') && (pawn[0] == pony[0])) {
  94. cout << 0.5 << endl;
  95. return 0;
  96. }
  97. // если пешке прегражден прыжок на 2 клетки
  98. else if ((pony[1] == '4') && (pawn[0] == pony[0])) {
  99. turn(2, pawn[0], pawn[1]+1, pony[0], pony[1]);
  100. std::sort(endings.begin(), endings.end());
  101. cout << endings[0].second << endl;
  102. }
  103. // на пути пешки ничего не стоит
  104. else {
  105. //если можно сходу побить поня
  106. if ((pawn[1]+1 == pony[1]) && ((pawn[0]+1 == pony[0])||(pawn[0]-1 == pony[0]))){
  107. cout << 1 << endl;
  108. return 0;
  109. }
  110. // иначе просчитываем варианты для двух веток развития событий
  111. else {
  112. turn(2, pawn[0], pawn[1]+1, pony[0], pony[1]);
  113. std::sort(endings.begin(), endings.end());
  114. Result result1 = endings[0];
  115.  
  116.  
  117. endings.clear();
  118. turn(2, pawn[0], pawn[1]+2, pony[0], pony[1]);
  119. std::sort(endings.begin(), endings.end());
  120. Result result2 = endings[0];
  121.  
  122. //и выбираем тот, в котором у пешки лучший результат
  123. cout << std::max(result1.second, result2.second) << endl;
  124. return 0;
  125. }
  126. }
  127. }
  128.  
  129. //позиция плевая - тупо обсчитываем все ходы и сортируем по позиции
  130. else {
  131. turn(1, pawn[0], pawn[1], pony[0], pony[1]);
  132. std::sort(endings.begin(), endings.end());
  133. cout << endings[0].second << endl;
  134. return 0;
  135. }
  136. }
  137.  
Success #stdin #stdout 0s 3468KB
stdin
g3 a1
stdout
-1