罗伯法构造幻方
4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
#include<iostream>
using namespace std;
int main()
{
int n;
int a[100],b[100],i,j,max;
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int n,m,i,j,k,a[30][30],b,c;
while(cin>>n)
{
if(n==0) break;
m=1;
k=n/2+1;
for(j=n;;j=j-2)
{
if(j<=0) j=n+j;
if(k==0) k=n+k;
if(m==n*n+1) break;
for(i=0,b=0,c=1;c<=n;i=i+1,b=b+1,c=c+1)
{
if(i+j==n+1);
a[i+j][b+k]=m;
m=m+1;
}
k=k-1;
while(cin>>n)
{
for(i=0;i<n;i++) cin>>b[i];
a[0]=1;
for(i=1;i<n;i++)
{
a[i]=1;
for(j=0;j<i;j++)
{
if(b[i]>b[j] && a[i]<=a[j])
a[i]=a[j]+1;
}
}
for(max=i=0;i<=n-1;i++)
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
cout<<endl;
}
return 0;
}
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
{
if(a[i]>max)
max=a[i];
}
cout<<max<<endl;
}
return 0;
}