华师一附中OI组
标题:
偶数阶幻方
[打印本页]
作者:
倚窗倾听风吹雨
时间:
2018-8-21 10:19
标题:
偶数阶幻方
本帖最后由 倚窗倾听风吹雨 于 2018-8-21 13:23 编辑
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
int a[6][6];
int ans;
bool v[17];
int main()
{
freopen("偶数阶幻方.txt","w",stdout);
for(int i=1;i<=16;i++)
{
if(i==1)cout<<i<<"i"<<endl;
a[1][1]=i;v[i]=1;
for(int j=1;j<=16;j++)
{
if(v[j])continue;
if(i==1 && j==4)cout<<j<<"j"<<endl;
a[1][2]=j;v[j]=1;
for(int k=1;k<=16;k++)
{
if(v[k])continue;
a[1][3]=k;
a[1][4]=34-i-j-k;
v[k]=1;
if(v[a[1][4]] || a[1][4]<=0 || a[1][4]>16)
{
v[k]=0;
continue;
}
v[a[1][4]]=1;
for(int l=1;l<=16;l++)
{
if(v[l])continue;
a[2][1]=l;v[l]=1;
a[2][2]=34-l-i-j;
if(v[a[2][2]] || a[2][2]<=0 || a[2][2]>16)
{
v[l]=0;
continue;
}
v[a[2][2]]=1;
for(int q=1;q<=16;q++)
{
if(v[q])continue;
a[2][3]=q;v[q]=1;
a[2][4]=i+j-q;
if(v[a[2][4]] || a[2][4]<=0 || a[2][4]>16)
{
v[q]=0;
continue;
}
v[a[2][4]]=1;
for(int w=1;w<=16;w++)
{
if(v[w])continue;
a[3][1]=w;v[w]=1;
a[4][1]=34-i-l-w;
if(v[a[4][1]] || a[4][1]<=0 || a[4][1]>16)
{
v[w]=0;
continue;
}
v[a[4][1]]=1;
for(int e=1;e<=16;e++)
{
if(v[e])continue;
a[3][2]=e;v[e]=1;
if(i+j+k-q-e!=34-i-l-w)
{
v[e]=0;
continue;
}
a[3][3]=i+j+l-q-e;
if(v[a[3][3]] || a[3][3]<=0 || a[3][3]>16)
{
v[e]=0;
continue;
}
v[a[3][3]]=1;
a[3][4]=34-w-i-j-l+q;
if(v[a[3][4]] || a[3][4]<=0 || a[3][4]>16)
{
v[a[3][3]]=0;
v[e]=0;
continue;
}
v[a[3][4]]=1;
a[4][2]=i+l-e;
if(v[a[4][2]] || a[4][2]<=0 || a[4][2]>16)
{
v[a[3][3]]=0;
v[e]=0;
v[a[3][4]]=0;
continue;
}
v[a[4][2]]=1;
a[4][3]=34-k-i-j-l+e;
if(v[a[4][3]] || a[4][3]<=0 || a[4][3]>16)
{
v[a[3][3]]=0;
v[e]=0;
v[a[3][4]]=0;
v[a[4][2]]=0;
continue;
}
v[a[4][3]]=1;
a[4][4]=w-34+i+k+j+l;
if(v[a[4][4]] || a[4][4]<=0 || a[4][4]>16)
{
v[a[3][3]]=0;
v[e]=0;
v[a[3][4]]=0;
v[a[4][2]]=0;
v[a[4][3]]=0;
continue;
}
v[a[4][4]]=1;
for(int r=1;r<=4;r++)
{
for(int t=1;t<=4;t++)
cout<<setw(3)<<a[r][t];
cout<<endl;
}
ans++;
cout<<endl;
v[a[3][3]]=0;
v[e]=0;
v[a[3][4]]=0;
v[a[4][2]]=0;
v[a[4][3]]=0;
v[a[4][4]]=0;
}
v[w]=0;
v[a[4][1]]=0;
}
v[q]=0;
v[a[2][4]]=0;
}
v[l]=0;
v[a[2][2]]=0;
}
v[k]=0;
v[a[1][4]]=0;
}
v[j]=0;
}
v[i]=0;
}
cout<<ans<<endl;
return 0;
}
复制代码
作者:
吴语林
时间:
2018-8-21 10:35
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int a[10][10],book[20],all=0;
void dfs(int x,int y,int num)
{
if(y==4)
y=1,x++;
else
y++;
if(x==1&&y==4)
{
a[1][4]=34-a[1][1]-a[1][2]-a[1][3];
if(a[1][4]<=0||a[x][y]>16||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==2&&y==2)
{
a[2][2]=34-a[1][1]-a[1][2]-a[2][1];
if(a[2][2]<=0||a[x][y]>16||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==2&&y==4)
{
a[2][4]=34-a[2][1]-a[2][2]-a[2][3];
if(a[2][4]<=0||a[x][y]>16||a[2][4]!=34-a[1][3]-a[1][4]-a[2][3]||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==3&&y==3)
{
a[3][3]=34-a[3][2]-a[2][2]-a[2][3];
if(a[3][3]<=0||a[x][y]>16||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==3&&y==4)
{
a[3][4]=34-a[3][1]-a[3][2]-a[3][3];
if(a[3][4]<=0||a[x][y]>16||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==4&&y==1)
{
a[4][1]=34-a[1][1]-a[2][1]-a[3][1];
if(a[4][1]<=0||a[x][y]>16||book[a[x][y]]||a[4][1]!=34-a[1][4]-a[2][3]-a[3][2])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==4&&y==2)
{
a[4][2]=34-a[1][2]-a[2][2]-a[3][2];
if(a[4][2]<=0||a[x][y]>16||a[4][2]!=34-a[3][1]-a[3][2]-a[4][1]||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==4&&y==3)
{
a[4][3]=34-a[1][3]-a[2][3]-a[3][3];
if(a[4][3]<=0||a[x][y]>16||book[a[x][y]])
return;
book[a[x][y]]=1;
dfs(x,y,a[x][y]);
book[a[x][y]]=0;
}
else if(x==4&&y==4)
{
a[4][4]=34-a[1][4]-a[2][4]-a[3][4];
if(a[4][4]<=0||a[x][y]>16||book[a[x][y]]||a[4][4]!=34-a[3][3]-a[3][4]-a[4][3]||a[4][4]!=34-a[4][1]-a[4][2]-a[4][3]||a[4][4]!=34-a[1][1]-a[2][2]-a[3][3])
return;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
printf("%2d ",a[i][j]);
printf("\n");
}
printf("\n---------------\n");
all++;
}
else
{
for(int i=1;i<=16;i++)
if(!book[i])
{
book[i]=1;
a[x][y]=i;
dfs(x,y,i);
book[i]=0;
}
}
}
int main()
{
freopen("11.txt","w",stdout);
for(int i=1;i<=16;i++)
{
book[i]=1;
a[1][1]=i;
dfs(1,1,i);
book[i]=0;
}
printf("\n%d",all);
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-8-21 11:01
本帖最后由 倚窗倾听风吹雨 于 2018-8-21 13:24 编辑
以下是检验程序
#include<iostream>
#include<cstdio>
using namespace std;
int wrong,r,a[5][5],sum;
bool v[17],flag;
int main()
{
freopen("偶数阶幻方.txt","r",stdin);
cin>>n;///输入总结果数
while(n--)
{
flag=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
cin>>a[i][j];
v[a[i][j]]=1;
}
for(int i=1;i<=16;i++)
if(!v[i])
{
wrong++;
flag=1;
break;
}
if(flag==1)continue;
for(int i=1;i<=4;i++)
{
sum=0;
for(int j=1;j<=4;j++)
sum+=a[i][j];
if(sum!=34)
{
wrong++;
flag=1;
break;
}
}
if(flag==1)continue;
for(int j=1;j<=4;j++)
{
sum=0;
for(int i=1;i<=4;i++)
sum+=a[i][j];
if(sum!=34)
{
wrong++;
flag=1;
break;
}
}
if(flag==1)continue;
sum=a[1][1]+a[1][2]+a[2][1]+a[2][2];
if(sum!=34)
{
wrong++;
continue;
}
sum=a[1][3]+a[1][4]+a[2][3]+a[2][4];
if(sum!=34)
{
wrong++;
continue;
}
sum=a[2][2]+a[2][3]+a[3][2]+a[3][3];
if(sum!=34)
{
wrong++;
continue;
}
sum=a[3][1]+a[3][2]+a[4][1]+a[4][2];
if(sum!=34)
{
wrong++;
continue;
}
sum=a[3][3]+a[3][4]+a[4][3]+a[4][4];
if(sum!=34)
{
wrong++;
continue;
}
sum=0;
for(int i=1;i<=4;i++)
sum+=a[i][i];
if(sum!=34)
{
wrong++;
continue;
}
sum=0;
sum=a[1][4]+a[2][3]+a[3][2]+a[4][1];
if(sum!=34)
{
wrong++;
continue;
}
r++;
}
cout<<r<<" "<<wrong<<endl;
return 0;
}
复制代码
输出的结果;
作者:
admin
时间:
2018-8-22 19:40
很好!还有检验程序,但是为什么感觉程序都是如此的复杂呢?
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2