解法為把0~9共十個數字做所有排列,第一個數字捨去剩9個數字再來驗證
得到以下結果
-----
2 7 6
9 5 1
4 3 8
No.1 - Sum of a line = 15
-----
2 9 4
7 5 3
6 1 8
No.2 - Sum of a line = 15
-----
4 3 8
9 5 1
2 7 6
No.3 - Sum of a line = 15
-----
4 9 2
3 5 7
8 1 6
No.4 - Sum of a line = 15
-----
6 1 8
7 5 3
2 9 4
No.5 - Sum of a line = 15
-----
6 7 2
1 5 9
8 3 4
No.6 - Sum of a line = 15
-----
8 1 6
3 5 7
4 9 2
No.7 - Sum of a line = 15
-----
8 3 4
1 5 9
6 7 2
No.8 - Sum of a line = 15
-----
1 6 5
8 4 0
3 2 7
No.9 - Sum of a line = 12
-----
1 8 3
6 4 2
5 0 7
No.10 - Sum of a line = 12
-----
3 2 7
8 4 0
1 6 5
No.11 - Sum of a line = 12
-----
3 8 1
2 4 6
7 0 5
No.12 - Sum of a line = 12
-----
5 0 7
6 4 2
1 8 3
No.13 - Sum of a line = 12
-----
5 6 1
0 4 8
7 2 3
No.14 - Sum of a line = 12
-----
7 0 5
2 4 6
3 8 1
No.15 - Sum of a line = 12
-----
7 2 3
0 4 8
5 6 1
No.16 - Sum of a line = 12
3628800 permutations checked
//----以下為C++程式碼----
#include "stdafx.h"
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
#include <conio.h>
using namespace std;
#define FIRST_NUM 7
#define LAST_NUM 17
int main(void)
{
vector<int> v;
int totalsum, linesum;
int no = 0;
int cnt = 0;
for( int i = FIRST_NUM; i <= LAST_NUM; i++)
v.push_back( i ); // Initialize FIRST_NUM ~ LAST_NUM
if( LAST_NUM - FIRST_NUM < 9 )
return 0;
do
{
++no;
totalsum = 4 * v[4] + 3 * ( v[0]+v[2]+v[6]+v[8] ) + 2 * ( v[1]+v[3]+v[5]+v[7] );
if( 0 == totalsum % 8 )
{
linesum = totalsum / 8;
if( linesum != v[0]+v[1]+v[2] ) continue;
if( linesum != v[3]+v[4]+v[5] ) continue;
if( linesum != v[6]+v[7]+v[8] ) continue;
if( linesum != v[0]+v[3]+v[6] ) continue;
if( linesum != v[1]+v[4]+v[7] ) continue;
if( linesum != v[2]+v[5]+v[8] ) continue;
if( linesum != v[0]+v[4]+v[8] ) continue;
if( linesum != v[2]+v[4]+v[6] ) continue;
cout << "-----" << endl;
cout << v[0] << " " << v[1] << " "<< v[2] << " " << endl;
cout << v[3] << " " << v[4] << " "<< v[5] << " " << endl;
cout << v[6] << " " << v[7] << " "<< v[8] << " " << endl;
cout << "No." << ++cnt << " - Sum of a line = " << linesum << endl;
}
} while( next_permutation( v.begin(), v.end() ) );
cout << no << " permutations checked" << endl;
return 0;
}//----以上為C++程式碼----