67跳棋(5)

举报
用户已注销 发表于 2021/11/19 06:58:48 2021/11/19
【摘要】 智力游戏 不得不说,这个游戏很难,而且编程也很难。 花了不少功夫,才得到一个勉强给出解的程序。 最难的地方就是,如何避免死循环,也就是(2,0)和(3,1)之间一直跳转的死循环 代码: #include<iostream>using namespace std; i...

智力游戏




不得不说,这个游戏很难,而且编程也很难。

花了不少功夫,才得到一个勉强给出解的程序。

最难的地方就是,如何避免死循环,也就是(2,0)和(3,1)之间一直跳转的死循环

代码:


  
  1. #include<iostream>
  2. using namespace std;
  3. int number = 4;
  4. bool move(int list[][5], int i, int j) //判断是否能够从(i,j)开始跳,最多只用number步
  5. {
  6. if (list[i][j] == 0)return false;
  7. int save[5][5], save_number = number;
  8. for (int i = 0; i < 5; i++) //保存list,用于回溯的时候还原list
  9. for (int j = 0; j < 5; j++)save[i][j] = list[i][j];
  10. if (number <= 0)
  11. {
  12. int sum = 0; //判断是不是已经成功了
  13. for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)sum += list[i][j];
  14. if (sum == 1 && list[2][2] == 1)return true;
  15. return false;
  16. }
  17. if (i>1 && list[i - 1][j] == 1 && list[i - 2][j] == 0) //满足往上跳的条件
  18. {
  19. list[i][j]--;
  20. list[i - 1][j]--;
  21. list[i - 2][j]++;
  22. if (move(list, i - 2, j))
  23. {
  24. cout << i << " 上 " << j << endl;
  25. return true;
  26. }
  27. }
  28. else if (i<3 && list[i + 1][j] == 1 && list[i + 2][j] == 0) //满足往下跳的条件
  29. {
  30. list[i][j]--;
  31. list[i + 1][j]--;
  32. list[i + 2][j]++;
  33. if (move(list, i + 2, j))
  34. {
  35. cout << i << " 下 " << j << endl;
  36. return true;
  37. }
  38. }
  39. else if (j>1 && list[i][j - 1] == 1 && list[i][j - 2] == 0) //满足往左跳的条件
  40. {
  41. list[i][j]--;
  42. list[i][j - 1]--;
  43. list[i][j - 2]++;
  44. if (move(list, i, j - 2))
  45. {
  46. cout << i << " 左 " << j << endl;
  47. return true;
  48. }
  49. }
  50. else if (j<3 && list[i][j + 1] == 1 && list[i][j + 2] == 0) //满足往右跳的条件
  51. {
  52. list[i][j]--;
  53. list[i][j + 1]--;
  54. list[i][j + 2]++;
  55. if (move(list, i, j + 2))
  56. {
  57. cout << i << " 右 " << j << endl;
  58. return true;
  59. }
  60. }
  61. else if (i>1 && j>1 && list[i - 1][j - 1] == 1 && list[i - 2][j - 2] == 0) //满足往左上跳的条件
  62. {
  63. list[i][j]--;
  64. list[i - 1][j - 1]--;
  65. list[i - 2][j - 2]++;
  66. if (move(list, i - 2, j - 2))
  67. {
  68. cout << i << " 左上 " << j << endl;
  69. return true;
  70. }
  71. }
  72. else if (i<3 && j>1 && list[i + 1][j - 1] == 1 && list[i + 2][j - 2] == 0) //满足往左下跳的条件
  73. {
  74. list[i][j]--;
  75. list[i + 1][j - 1]--;
  76. list[i + 2][j - 2]++;
  77. if (move(list, i + 2, j - 2))
  78. {
  79. cout << i << " 左下 " << j << endl;
  80. return true;
  81. }
  82. }
  83. else if (i>1 && j<3 && list[i - 1][j + 1] == 1 && list[i - 2][j + 2] == 0) //满足往右上跳的条件
  84. {
  85. list[i][j]--;
  86. list[i - 1][j + 1]--;
  87. list[i - 2][j + 2]++;
  88. if (move(list, i - 2, j + 2))
  89. {
  90. cout << i << " 右上 " << j << endl;
  91. return true;
  92. }
  93. }
  94. else if (i<3 && j<3 && list[i + 1][j + 1] == 1 && list[i + 2][j + 2] == 0) //满足往右下跳的条件
  95. {
  96. list[i][j]--;
  97. list[i + 1][j + 1]--;
  98. list[i + 2][j + 2]++;
  99. if (move(list, i + 2, j + 2))
  100. {
  101. cout << i << " 右下 " << j << endl;
  102. return true;
  103. }
  104. }
  105. number--;
  106. for (int ii = 0; ii < 5; ii++) //还有8个方向都跳不了的情况,以及可以跳但是我选择不跳的情况
  107. for (int jj = 0; jj < 5; jj++)
  108. {
  109. if (ii == i&&jj == j)continue;
  110. if (move(list, ii, jj))return true;
  111. }
  112. for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)list[i][j] = save[i][j];//还原list
  113. number = save_number;
  114. return false;
  115. }
  116. int main()
  117. {
  118. int list[5][5]; //list用来表示状态,0表示空格,1表示有棋子
  119. for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++)
  120. {
  121. if (i == 1 || i == 3 || j == 1 || j == 3)list[i][j] = 1;
  122. else list[i][j] = 0;
  123. }
  124. list[2][2] = 1;
  125. move(list, 2, 2);
  126. cout << endl << "注意,输出的顺序是反着的";
  127. system("pause>nul");
  128. return 0;
  129. }

输出:

4 右上 2
2 右下 0
2 左 2
0 左下 4
2 上 4
4 上 4
4 右 2
4 右 0
2 下 0
0 左下 3
1 右 0
3 左上 2
0 左 2
2 上 2
注意,输出的顺序是反着的



文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/53050436

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。