next_permutation() 是一个 C++ STL 函数
头文件:<algorithm>。作用:将当前排列更改为全排列中的下一个排列。注意:函数在 C++ 中是设计用来处理一维序列,因此不能直接用于二维数组。
如果当前排列已经是全排列中的最后一个排列(元素完全从大到小排列),函数返回 false 并将排列更改为全排列中的第一个排列(元素完全从小到大排列);否则,函数返回 true。
#include<stdio.h>
#include<algorithm>
using namespace std;//C++中的标准库中的所有功能都被包含在std命名空间中
int p[10],a[5][5],b[5][5],c[5][5];
int main()
{
int i = 0;
int j = 0;
int ans = 0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=9;i++)
{
p[i] = i;
}
do{
b[0][0] = p[1];
b[0][1] = p[2];
b[0][2] = p[3];
b[1][0] = p[4];
b[1][1] = p[5];
b[1][2] = p[6];
b[2][0] = p[7];
b[2][1] = p[8];
b[2][2] = p[9];
bool check = true;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(!a[i][j])continue;
if(a[i][j]!=b[i][j])check = false;
}
}
if(!check)continue;
int sum = 0;
sum = b[0][0]+b[1][1]+b[2][2];
if(sum!=b[0][2]+b[1][1]+b[2][0])continue;
int t1 = 0;
int t2 = 0;
for(i=0;i<3;i++)
{
t1 = 0;
t2 = 0;
for(j=0;j<3;j++)
{
t1 += b[i][j];
t2 += b[j][i];
}
if(sum!=t1||sum!=t2)check = false;
}
if(!check)continue;
ans++;
if(ans>1)
{
printf("Too Many\n");
return 0;
}
else
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c[i][j] = b[i][j];
}
}
}
}while(next_permutation(p+1,p+1+9));
//给出的矩阵至少能还原出一组可行的三阶幻方
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
}
return 0;
}