​​智力游戏​​

67跳棋(5)_i++




67跳棋(5)_i++_02


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

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

最难的地方就是,如何避免死循环,也就是(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
注意,输出的顺序是反着的


67跳棋(5)_#include_03