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