算法实验二 【三阶幻方】(回溯算法)
1579.三阶幻方
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
三阶幻方是最简单的幻方,又叫九宫格,是由1,2,3,4,5,6,7,8,9九个数字组成的一个三行三列的矩阵,其对角线、横行、纵向的的和都为15。
输入
无
输出
按字典序输出所有的满足条件的幻方矩阵,每两个数字之间带一个空格,行尾无空格,每个幻方后带一个空行。
输入样例
无
输出样例
无`
#include<iostream>
using namespace std;
int a[9];
int used[10];
int col[3],lin[3],dia[2];
void dfs(int m);
bool can();
void output();
int main()
{
dfs(0);
return 0;
}
void dfs(int m)
{
if(m==9)
{
if(can()) output();
}
else
{
for(int i=1;i<10;i++)
{
if(!used[i])
{
a[m]=i;
used[i]=1;
dfs(m+1);
used[i]=0;
}
}
}
}
bool can()
{
for(int i=0;i<3;i++)
{
col[i]=lin[i]=0;
if(i<2) dia[i]=0;
}
for(int m=0;m<9;m++)
{
col[m/3]+=a[m];
lin[m%3]+=a[m];
if(m==0||m==4||m==8)
{
dia[0]+=a[m];
}
if(m==2||m==4||m==6)
{
dia[1]+=a[m];
}
}
for(int i=0;i<3;i++)
{
if(col[i]!=15||lin[i]!=15) return false;
else if(i<2&&dia[i]!=15) return false;
}
return true;
}
void output()
{
for(int i=0;i<9;i++)
{
if(i%3==0||i%3==1)
{
cout<<a[i]<<' ';
}
else cout<<a[i]<<endl;
}
cout<<endl;
}
还是10.23做的(我简直懒癌晚期,害)
这道题深搜没有什么好说的,判断好像也没有什么好说的,输出是前两列一种情况,最后一列一种情况~