第2个回答 2021-02-08
我用C++枚举了一下
代码如下
#include <iostream>
using namespace std;
/*
C++求和十五
* * *
* 5 *
* * *
*/
bool cmpDeposit(int a[9],int b) {
//比对数值是否使用
for (int i = 0; i < 9; i++) {
if (a[i] == b) {
return false;
}
}
return true;
}
void empArr(int* a, int b) {
//从第几位清空使用数值
for (int i = b; i < 9; i++) {
a[i] = 0;
}
}
bool cmpArr(int a[][3]) {
//判断结果
for (int i = 0; i < 3; i++) {
if (a[i][0] + a[i][1] + a[i][2] != 15) {
return false;
}
if (a[0][i] + a[1][i] + a[2][i] != 15) {
return false;
}
}
if (a[0][0] + a[1][1] + a[2][2] != 15) {
return false;
}
if (a[0][2] + a[1][1] + a[2][0] != 15) {
return false;
}
//如果为真,则表示枚举成立
return true;
}
int main(void) {
clock_t startTime, endTime;
startTime = clock();//计时开始
int disc[3][3] = { //初始化棋盘
{0,0,0},
{0,5,0},
{0,0,0},
};
int sum[9] = { 0 }; //九位不同的数值
for (int i = 1; i < 10; i++) {
//枚举中间横向
sum[1] = i;
sum[2] = (15 - i - 5);
disc[1][0] = sum[1];
disc[1][2] = sum[2];
for (int ii = 1; ii < 10; ii++) {
//枚举中间纵向
if (cmpDeposit(sum, ii)) {
sum[3] = ii;
sum[4] = (15 - ii - 5);
disc[0][1] = sum[3];
disc[2][1] = sum[4];
for (int iii = 1; iii < 10; iii++) {
//枚举左边纵向
if (cmpDeposit(sum, iii)) {
sum[5] = iii;
sum[6] = (15 - iii - 5);
disc[0][0] = sum[5];
disc[2][2] = sum[6];
for (int iiii = 1; iiii < 10; iiii++) {
//枚举右边纵向
if (cmpDeposit(sum, iiii)) {
sum[7] = iiii;
sum[8] = (15 - iiii - 5);
disc[0][2] = sum[7];
disc[2][0] = sum[8];
//判断数组是否正确
if (cmpArr(disc)) {
//输出得到的结果
for (int i = 0; i < 3; i++) {
cout << disc[i][0] << disc[i][1] << disc[i][2] << endl;
}
cout << endl;
}
}
empArr(sum, 7);
}
}
empArr(sum, 5);
}
}
empArr(sum, 3);
}
empArr(sum, 1);
}
cout << "运算时间: " << (double)(clock() - startTime) / CLOCKS_PER_SEC << "s" << endl;
}
得到了八种结果 分别是
834 | 672 | 816 | 492 | 618 | 294 | 438 | 276
159 | 159 | 357 | 357 | 753 | 753 | 951 | 951
672 | 834 | 492 | 816 | 294 | 618 | 276 | 438