三阶幻方
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
三阶幻方是最简单的幻方,又叫九宫格,是由1,2,3,4,5,6,7,8,9九个数字组成的一个三行三列的矩阵,其对角线、横行、纵向的的和都为15。
输入:
无
输出:
按字典序输出所有的满足条件的幻方矩阵,每两个数字之间带一个空格,行尾无空格,每个幻方后带一个空行。
输入样例:
无
输出样例:
无
来源:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int checkrow[10],checkcol[10],x1,x2;
int vis[10];
int str[10][10];
void dfs(int cnt)
{
int i,j;
int row=cnt/3;
int col=cnt%3;
if(cnt==9)
{
if(x1==15&&x2==15)
{
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%d ",str[i][j]);
printf("%d\n",str[i][j]);
}
printf("\n");
}
return;
}
for(i=1;i<=9;i++)
{
if(!vis[i])
{
if(cnt==0||cnt==4||cnt==8)
{
x1+=i;
if(x1>15)
{
x1-=i;
continue;
}
}
if(cnt==2||cnt==4||cnt==6)
{
x2+=i;
if(x2>15)
{
if(cnt==0||cnt==4||cnt==8) x1-=i;
x2-=i;
continue;
}
}
checkrow[row]+=i;
if(checkrow[row]>15)
{
if(cnt==0||cnt==4||cnt==8) x1-=i;
if(cnt==2||cnt==4||cnt==6) x2-=i;
checkrow[row]-=i;
continue;
}
checkcol[col]+=i;
if(checkcol[col]>15)
{
if(cnt==0||cnt==4||cnt==8) x1-=i;
if(cnt==2||cnt==4||cnt==6) x2-=i;
checkrow[row]-=i;
checkcol[col]-=i; 这个分层次还原真的是难以发现。
continue;
}
str[row][col]=i;
vis[i]=1;
dfs(cnt+1);
vis[i]=0;
str[row][col]=0;
checkcol[col]-=i;
checkrow[row]-=i;
if(cnt==2||cnt==4||cnt==6) x2-=i;
if(cnt==0||cnt==4||cnt==8) x1-=i;
}
}
}
int main()
{
memset(checkrow,0,sizeof(checkrow));
memset(checkcol,0,sizeof(checkcol));
x1=0,x2=0;
memset(vis,0,sizeof(vis));
dfs(0); //一维表二维进行深搜枚举
return 0;
}