67跳棋(5)

来源:互联网 发布:nodejs网络爬虫源码 编辑:程序博客网 时间:2024/04/28 08:48

智力游戏




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

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

最难的地方就是,如何避免死循环,也就是(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,用于回溯的时候还原listfor (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];//还原listnumber = 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
注意,输出的顺序是反着的



1 0