清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#this is for solving the problem of magic square
#!/usr/bin/perl -w
use strict;
#input a number ,judge it is an odd or 4k or 4k+2 or err.
print "Please enter an integer > 2\n";
chomp (my $x = <STDIN>);
my $remain = $x % 4;
my $little = $x/2;
my @a;
if ($x >= 3 )
{
if (($remain == 1) || ($remain == 3))
{
odd($x); #it's an odd.use the subroutin of odd.
}
elsif ($remain == 2)
{
double_odd($x); #it's 4k+2.use the subroutin of double_odd.
}
elsif ($remain == 0)
{
double_even($x); #it's 4k.use the subroutin of double_even
}
}
else
{
print "please enter an integer >2\n";
exit;
}
#print the magic square
for(my $i=0;$i<$x;$i++)
{
for(my $j=0;$j<$x-1;$j++)
{
print "$a[$i][$j]\t";
}
print "$a[$i][$x-1]\n";#the last element of every row in the array followed"\n".
sub double_odd
{
my $k=($little-1)/2;
for(my $i=0;$i<$x;$i++)
{
for(my $j=0;$j<$x;$j++)
{
$a[$i][$j]=0;
}
}
odd($little);
for(my $i=0;$i<$little;$i++)
{
for(my $j=0;$j<$little;$j++)
{
$a[$i][$j+$little]=$a[$i][$j]+50;
$a[$i+$little][$j]=$a[$i][$j]+75;
$a[$i+$little][$j+$little]=$a[$i][$j]+25;
}
}
for(my $i=0;$i<$little;$i++)
{
if($i!=$k)
{
for(my $j=0;$j<$k;$j++)
{
my $b = $a[$i][$j];
$a[$i][$j]=$a[$i+$little][$j];
$a[$i+$little][$j] = $b;
}
}
else
{
for(my $j=$k;$j<2*$k;$j++)
{
my $b = $a[$i][$j];
$a[$i][$j]=$a[$i+$little][$j];
$a[$i+$little][$j] = $b;
}
}
}
}
sub odd
{
(my $z) = @_;
my $i = 0;
my $j = ($z-1)/2;
for(my $c=1;$c<=$z * $z;$c++)
{
$a[$i][$j] = $c;
$i--;
$j++;
if($a[$i][$j])
{$i=$i+2;$j--;}
elsif($i<0 && $j<$z)
{$i=$z-1;}
elsif($j>=$z && $i>=0)
{$j=0;}
elsif($i<0 && $j>=$z)
{$i=$i+2;$j--;}
elsif($i==0 && $j==0)
{$i=$z-1;}
}
}
sub double_even
{
my $n = $x-1;
my $b = 1;
for(my $i=0;$i<$x;$i++)
{
for(my $j=0;$j<=$n;$j++,$b++)
{
$a[$i][$j]=$b;
}
}
for(my $i=0;$i<$x/2;$i++)
{
for(my $j=0;$j<$x;$j++)
{
if ($i ==$j || $i==($n-$j) || ($i+$j)% 4==3 || ($j-$i)% 4==0)
{
my $c=$a[$i][$j];
$a[$i][$j]=$a[$n-$i][$n-$j];
$a[$n-$i][$n-$j]=$c;
}
}
}
}