67跳棋(5)
【摘要】
智力游戏
不得不说,这个游戏很难,而且编程也很难。
花了不少功夫,才得到一个勉强给出解的程序。
最难的地方就是,如何避免死循环,也就是(2,0)和(3,1)之间一直跳转的死循环
代码:
#include<iostream>using namespace std; i...
智力游戏


不得不说,这个游戏很难,而且编程也很难。
花了不少功夫,才得到一个勉强给出解的程序。
最难的地方就是,如何避免死循环,也就是(2,0)和(3,1)之间一直跳转的死循环
代码:
-
#include<iostream>
-
using namespace std;
-
-
int number = 4;
-
-
bool move(int list[][5], int i, int j) //判断是否能够从(i,j)开始跳,最多只用number步
-
{
-
if (list[i][j] == 0)return false;
-
int save[5][5], save_number = number;
-
for (int i = 0; i < 5; i++) //保存list,用于回溯的时候还原list
-
for (int j = 0; j < 5; j++)save[i][j] = list[i][j];
-
if (number <= 0)
-
{
-
int sum = 0; //判断是不是已经成功了
-
for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)sum += list[i][j];
-
if (sum == 1 && list[2][2] == 1)return true;
-
return false;
-
}
-
if (i>1 && list[i - 1][j] == 1 && list[i - 2][j] == 0) //满足往上跳的条件
-
{
-
list[i][j]--;
-
list[i - 1][j]--;
-
list[i - 2][j]++;
-
if (move(list, i - 2, j))
-
{
-
cout << i << " 上 " << j << endl;
-
return true;
-
}
-
}
-
else if (i<3 && list[i + 1][j] == 1 && list[i + 2][j] == 0) //满足往下跳的条件
-
{
-
list[i][j]--;
-
list[i + 1][j]--;
-
list[i + 2][j]++;
-
if (move(list, i + 2, j))
-
{
-
cout << i << " 下 " << j << endl;
-
return true;
-
}
-
}
-
else if (j>1 && list[i][j - 1] == 1 && list[i][j - 2] == 0) //满足往左跳的条件
-
{
-
list[i][j]--;
-
list[i][j - 1]--;
-
list[i][j - 2]++;
-
if (move(list, i, j - 2))
-
{
-
cout << i << " 左 " << j << endl;
-
return true;
-
}
-
}
-
else if (j<3 && list[i][j + 1] == 1 && list[i][j + 2] == 0) //满足往右跳的条件
-
{
-
list[i][j]--;
-
list[i][j + 1]--;
-
list[i][j + 2]++;
-
if (move(list, i, j + 2))
-
{
-
cout << i << " 右 " << j << endl;
-
return true;
-
}
-
}
-
else if (i>1 && j>1 && list[i - 1][j - 1] == 1 && list[i - 2][j - 2] == 0) //满足往左上跳的条件
-
{
-
list[i][j]--;
-
list[i - 1][j - 1]--;
-
list[i - 2][j - 2]++;
-
if (move(list, i - 2, j - 2))
-
{
-
cout << i << " 左上 " << j << endl;
-
return true;
-
}
-
}
-
else if (i<3 && j>1 && list[i + 1][j - 1] == 1 && list[i + 2][j - 2] == 0) //满足往左下跳的条件
-
{
-
list[i][j]--;
-
list[i + 1][j - 1]--;
-
list[i + 2][j - 2]++;
-
if (move(list, i + 2, j - 2))
-
{
-
cout << i << " 左下 " << j << endl;
-
return true;
-
}
-
}
-
else if (i>1 && j<3 && list[i - 1][j + 1] == 1 && list[i - 2][j + 2] == 0) //满足往右上跳的条件
-
{
-
list[i][j]--;
-
list[i - 1][j + 1]--;
-
list[i - 2][j + 2]++;
-
if (move(list, i - 2, j + 2))
-
{
-
cout << i << " 右上 " << j << endl;
-
return true;
-
}
-
}
-
else if (i<3 && j<3 && list[i + 1][j + 1] == 1 && list[i + 2][j + 2] == 0) //满足往右下跳的条件
-
{
-
list[i][j]--;
-
list[i + 1][j + 1]--;
-
list[i + 2][j + 2]++;
-
if (move(list, i + 2, j + 2))
-
{
-
cout << i << " 右下 " << j << endl;
-
return true;
-
}
-
}
-
-
number--;
-
for (int ii = 0; ii < 5; ii++) //还有8个方向都跳不了的情况,以及可以跳但是我选择不跳的情况
-
for (int jj = 0; jj < 5; jj++)
-
{
-
if (ii == i&&jj == j)continue;
-
if (move(list, ii, jj))return true;
-
}
-
-
for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)list[i][j] = save[i][j];//还原list
-
number = save_number;
-
return false;
-
}
-
-
int main()
-
{
-
int list[5][5]; //list用来表示状态,0表示空格,1表示有棋子
-
for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++)
-
{
-
if (i == 1 || i == 3 || j == 1 || j == 3)list[i][j] = 1;
-
else list[i][j] = 0;
-
}
-
list[2][2] = 1;
-
move(list, 2, 2);
-
cout << endl << "注意,输出的顺序是反着的";
-
system("pause>nul");
-
return 0;
-
}
输出:
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)