信息安全算法设计的实验之一
//#include"stdafx.h"
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include<iostream>
#include<math.h>
#define temp 34
using namespace std;
int n;
int b[16];
int a[4][4];
int sum = 0;
int judge()//因为行和列之前都已经判断过了,所以只需判断对角线
{
int t(0);
for (int i = 0; i < 4; i++)//左上-右下对角线
t += a[i][i];
if (t != temp)return 0;
t = 0;
for (int i = 3; i >= 0; i--)//左下-右上对角线
t += a[3 - i][i];
if (t != temp)return 0;
return 1;
}
int checkrow(int x)
{ //判断行
int i;
int num = 0;
for (i = 0; i<4; i++)
{
num += a[x][i];
}
if (num != temp)
return 0;
return 1;
}
int checkcolomn(int x)
{ //判断列
int i;
int num = 0;
for (i = 0; i<4; i++)
{
num += a[i][x];
}
if (num != temp)
return 0;
return 1;
}
void permute(int x)
{
int i, j;
if (x % 4 == 0 && x != 0)//如果已经填完一行
{
if (!checkrow((x - 1) / 4))//检查行
return;
}
if (x == 13 || x == 14 || x == 15 || x == 16)//如果填完了一列
{
if (!checkcolomn((x - 1) % 4))//检查列
return;
}
if (x == 16)//如果整个矩阵已填完
{
if (judge())
{
for (int i = 0; i<4; i++)
{
for (int j = 0; j<4; j++)
cout << a[i][j] << ' ';
cout << endl;
}
cout << endl;
system("pause");
exit(0);//老师要求只要找到一种情况就退出
sum++;
}
return;
}
for (i = 0; i<16; i++)
{
if (!b[i])//如果i这个数字没有使用过
{
b[i] = 1;
a[x / 4][x % 4] = (i + 1);//a[x / 4][x % 4] 将16个数的排列变为矩阵的坐标格式
permute(x + 1);//继续搜下一个
b[i] = 0;//回溯,将该数字标记回未填过
}
}
}
int main()
{
memset(b, 0, sizeof(b));
permute(0);
printf("%d\n", sum);
system("pause");
return 0;
}