当前位置:   article > 正文

ACM/ICPC——象棋_象棋 acm icpc

象棋 acm icpc

 考虑一个象棋残局,其中红方有n(2<=n=<7)个棋子,黑方只一个将(A),红方除了有一个帅(G)之外还有3种可能的棋子:车(R),马(H),炮(C),并且需要考虑“蹩马脚”与将和帅不能照面(将、帅如果在同一条直线上,中间又不隔着任何棋子的情况下,走子的一方获胜)的规则。

输入所有棋子的情况,保证局面合法且红方已经将军。你的任务是判断红方是否已经把黑方将死。关于中国象棋的相关规则各位读者请自行百度。

分析题目:

①:要判断黑方是否被将死,就是判断将在走出一步后是否会被红方中的任意一个棋子将死。

②:首先要判断黑方是否可以直接将红方将死,这样就不需要在进行下一步了。

③:然后还要判断黑方是否可以吃红方棋子的情况,如果可以吃掉某个棋子,就把这个棋子变成黑方可以走的位置。

④:再然后用一个数组标志棋盘的位置黑方是否可以走。

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. char a[10][9];//棋盘,上方为黑
  5. bool vis[10][9];//用来标志是否黑方是否可以走,标志为1则黑方不能走
  6. int flag = 0;//标志黑方是否已经被红方将死
  7. void setG(int x, int y)//帅所对的列,黑方不能走
  8. {
  9. while (--x&&a[x][y] == '.'&&x <= 0)
  10. vis[x][y] = true;
  11. }
  12. void setR(int x, int y)//车行走规则所对应黑方不能走的位置
  13. {
  14. int tx0 = x, ty0 = y;
  15. while (--tx0&&a[tx0][ty0] == '.'&&tx0 >= 0)
  16. {
  17. vis[tx0][ty0] = true;
  18. }
  19. int tx1 = x, ty1 = y;
  20. while (++tx1&&a[tx1][ty1] == '.'&&tx1<10)
  21. {
  22. vis[tx1][ty1] = true;
  23. }
  24. int tx2 = x, ty2 = y;
  25. while (--ty2&&a[tx2][ty2] == '.'&&ty2 >= 0)
  26. {
  27. vis[tx2][ty2] = true;
  28. }
  29. int tx3 = x, ty3 = y;
  30. while (++ty3&&a[tx3][ty3] == '.'&&ty3<9)
  31. {
  32. vis[tx3][ty3] = true;
  33. }
  34. }
  35. void setH(int x, int y)//
  36. {
  37. int next[10][2] = { { 0,0 },{ 0,0 },{ -2,-1 },{ -2,1 },{ -1,2 },{ 1,2 },{ 2,1 },{ 2,-1 },{ 1,-2 },{ -1,-2 } };//马走日字形的位置
  38. int book[5][2] = { {},{ -1,0 },{ 0,1 },{ 1,0 },{ 0,-1 } };//判断是否会蹩马脚
  39. int tx, ty;
  40. for (int i = 1; i <= 4; i++)
  41. {
  42. int xx, yy;
  43. xx = x + book[i][0];
  44. yy = y + book[i][1];
  45. for (int k = 0; k < 8; k++)
  46. {
  47. tx = x + next[k][0];
  48. ty = y + next[k][1];
  49. if (a[xx][yy] != '.' && (k == i * 2 || k == i * 2 + 1))
  50. continue;
  51. else
  52. vis[tx][ty] = true;
  53. }
  54. }
  55. }
  56. void setC(int x, int y)//
  57. {
  58. int tx0 = x, ty0 = y;
  59. while (tx0 < 10)
  60. {
  61. tx0++;
  62. if (a[tx0][ty0] != '.')
  63. {
  64. tx0++;
  65. if (a[tx0][ty0] != '.')
  66. break;
  67. vis[tx0][ty0] = true;
  68. }
  69. }
  70. int tx1 = x, ty1 = y;
  71. while (tx1 >= 0)
  72. {
  73. tx1--;
  74. if (a[tx1][ty1] != '.')
  75. {
  76. tx1--;
  77. if (a[tx1][ty1] != '.')
  78. break;
  79. vis[tx1][ty1] = true;
  80. }
  81. }
  82. int tx2 = x, ty2 = y;
  83. while (ty2 < 9)
  84. {
  85. ty2++;
  86. if (a[tx2][ty2] != '.')
  87. {
  88. ty2++;
  89. if (a[tx2][ty2] != '.')
  90. break;
  91. vis[tx2][ty2] = true;
  92. }
  93. }
  94. int tx = x, ty = y;
  95. while (ty >= 0)
  96. {
  97. ty--;
  98. if (a[tx][ty] != '.')
  99. {
  100. ty--;
  101. if (a[tx][ty] != '.')
  102. break;
  103. vis[tx][ty] = true;
  104. }
  105. }
  106. }
  107. //判断黑方是否有位置可以走
  108. void judge(int x, int y)
  109. {
  110. int next[4][2] = { { 1,0 },{ 0,1 },{ -1,0 },{ 0,-1 } };
  111. int tx, ty;
  112. for (int i = 0; i < 4; i++)
  113. {
  114. tx = x + next[i][0];
  115. ty = y + next[i][1];
  116. if (!vis[tx][ty] && a[tx][ty] == '.')
  117. {
  118. cout << "黑方赢" << endl;
  119. flag = 1;
  120. }
  121. }
  122. }
  123. int main()
  124. {
  125. int Ax, Ay;
  126. for (int i = 0; i < 10; i++)
  127. for (int j = 0; j < 9; j++)
  128. vis[i][j] = false;
  129. for (int i = 0; i < 10; i++)
  130. for (int j = 0; j < 9; j++)
  131. cin >> a[i][j];
  132. for (int i = 0; i < 10; i++)
  133. {
  134. for (int j = 0; j < 9; j++)
  135. {
  136. int next[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
  137. if (a[i][j] == 'A')
  138. {
  139. Ax = i;
  140. Ay = j;
  141. int x = i;
  142. int y = j;
  143. //判断黑方是否可以直接将红方将死
  144. while (++x&&x>10)
  145. {
  146. if (a[x][y] != '.'&&a[x][y] != 'G')
  147. break;
  148. else if (a[x][y] == 'G')//如果可以将死红方,则不需要走下一步了
  149. {
  150. cout << "黑方赢" << endl;
  151. return 0;
  152. }
  153. }
  154. }
  155. //判断黑方的将是否可以吃掉红方的棋子
  156. for (int i = 0; i < 4; i++)
  157. {
  158. int tx = Ax + next[i][0];
  159. int ty = Ay + next[i][0];
  160. if (a[tx][ty] != '.')
  161. a[tx][ty] = '.';
  162. }
  163. if (a[i][j] == 'G')
  164. {
  165. setG(i, j);
  166. }
  167. if (a[i][j] == 'R')
  168. {
  169. setR(i, j);
  170. }
  171. if (a[i][j] == 'H')
  172. {
  173. setH(i, j);
  174. }
  175. if (a[i][j] == 'C')
  176. {
  177. setC(i, j);
  178. }
  179. }
  180. }
  181. judge(Ax, Ay);
  182. if (!flag)
  183. {
  184. cout << "红方赢" << endl;
  185. }
  186. return 0;
  187. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/683395
推荐阅读
相关标签
  

闽ICP备14008679号