// 1:自然数1总是在方阵第一行当中一列上。
// 2:后续的自然数在当前数的右上方,
// 1)如果是在第一行则行数变为第n行列数加1 ;
// 2)如果是在最后一列,行数减1,列数为第1行。
// 3)如果后续的数所处位置已有数,则行数加1,列数不变。
/******************************************************************************************************************************
巧填奇数阶幻方(魔方阵)[转]2007-01-03 17:57 一、什么叫幻方?
(通俗点说)把一些有规律的数填在纵横格数都相等的正方形图内,使每一行、每一列和每一条对角线上各个数之和都相等。这样的方阵图叫做幻方。
幻方又分为奇数阶幻方和偶数阶幻方。链芹奇数阶幻方是指横行、竖列都是单数(即3、5、7、9……)的方阵图。偶数阶幻方是指横行、竖列都是双数(即4、6、8、10……)的方阵图。
二、奇数阶幻方的填法。
奇数阶幻方中最简便的一种就是三阶幻方,又称“九宫图”。
平常我们遇到这类题都是用分析、分组、尝试的方法推出,这种方法较麻烦,如果是五阶幻方、七阶幻方就更困难了。
有一种方法不仅能很快地填出三阶幻方,还能很快地填出五阶幻方、七阶幻方、九阶幻方……那就是“口诀法”
口 诀
“1”坐边中间,斜着把数填;
出边填对面,遇数往下旋;
出角仅棚逗毕一次,转回下格间。
注意:
(1)这里的“1”,是指要填的这一列数中的第一个数。
(2)“1”坐边中间,指第一个数要填在任何一边的正中间的空格里。
(3)从1到2时,必须先向边外斜(比如:第一个数填在上边的正中间,填第二个数时,要向左上方或右上方斜),填后面的数时也要按照同样的方向斜。
*******************************************************************************************************************************/
#include<iostream>
using namespace std
void main()
{
int a[32][32],i,j,k,p,n
p=1
while(p==1)
{
cout<<"Enter n(n=1~25):"
cin>>n
if((n!=0)&&(n<=25)&&(n%2!=0))
p=0
}
for(i=1i<=ni++)
for(j=1j<=nj++)
a[i][j]=0
j=n/2+1
a[1][j]=1
for(k=2k<=n*nk++)
{
i=i-1
j=j+1
if((i<1)&&(j>n))
{
i=i+2
j=j-1
}
else
{
if(i<1)
i=n
if(j>n)
j=1
}
if(a[i][j]==0)
a[i][j]=k
else
{
i=i+2
j=j-1
a[i][j]=k
}
}
for(i=1i<=ni++)
{
for(j=1j<=nj++)
cout<<a[i][j]<<" "
cout<<endl
}
}
/*C_ban*
所谓的魔方距阵就是一种特殊的奇数阶方阵:它的行,列,对角线,上的数字之和都要相等,且方阵中的每一个数字都不相等,且数字的范围都在1到n*n之间.
我编的程序如下:
*/
#include<stdio.h>
#define N 15
main()
{
int i,j,row,cloum,size,square[N][N],count
clrscr()
printf("please enter the square size(odd &&<=15):\n")
scanf("%d"指竖,&size)
while(size%2==0||size>15||size<3)
{
printf("error due to the wrng input!please input it again!\n")
scanf("%d",&size)
}
for(i=0i<sizei++)
for(j=0j<sizej++)
square[i][j]=0
i=0j=(size-1)/2
square[i][j]=1
for(count=2count<=size*sizecount++)
{
row=i-1<0?(size-1):(i-1)
cloum=j-1<0?(size-1):(j-1)
if(square[row][cloum])
i=(++i)%size
else
{i=row
j=j-1<0?(size-1):(j-1)
}
square[i][j]=count
}
printf("the %d square is:\n",size)
for(i=0i<sizei++)
{
for(j=0j<sizej++)
printf("%d",square[i][j])
printf("\n")
}
}
只能求奇数的魔方阵
#define N 20
main()
{
int a[N][N]
int n,i,j,r
scanf("%d",&n)
for(i=0i<Ni++) for(j=0j<Nj++) a[i][j]=0
i=0
j=n/2
a[i][j]=1
for (r=2r<=n*nr++)
if (a[(i+n-1)%n][(j+1)%n]==0)
{i=(i+n-1)%nj=(j+1)%na[i][j]=r}
else
{i=(i+1)%na[i][j]=r}
for(i=0i<ni++)
{
for(j=0j<nj++) printf("%4d",a[i][j])
printf("\n")
}
}
这是以前别人写的,你参考一下!
#include <stdio.h>#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAX_INDEX 100
void swap(int *a,int *b)
{
int t
t=*a
*a=*b
*b=t
}
/*快速排序算法*/
void QuickSort(int a[], int l, int r)
{
int i=l/*从左至右的游标*/
int j=r + 1/*从右到左的游标*/
int pivot=a[l]
if (l >= r) return
/*把左侧>= pivot的元素与右侧<= pivot 的元素进行交换*/
while (1)
{
do
{/*在左侧寻找>= pivot 的元素*/
i = i + 1
} while (a[i] <pivot)
do
{/*在右侧寻找<= pivot 的元素*/
j = j - 1
} while (a[j] >pivot)
if (i >= j) break/仔氏*未发现交换对象*/
swap(&a[i],&a[j])
}
/*设置p i v o t*/伍铅
a[l] = a[j]
a[j] = pivot
QuickSort(a, l, j-1)/*对左段排序*/
QuickSort(a, j+1, r)/*对右段排序*/
}
void Huanf(int Array[][MAX_INDEX],int n)
{
int i,j
int a,b,m
int tempArray1[MAX_INDEX]
int tempArray2[MAX_INDEX]
a=n/2
b=a+1
m=n%4
switch(m)
{
case 0:
case 2:
/*穿心腔戚好对调*/
for(i=0i<ni++)
for(j=0j<n/2j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
else if(i%2==0&&Array[i][j]%2==1)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
}
else
{
if(i%2==1&&Array[i][j]%2==1)/*偶行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
}
}
/*End穿心对调*/
if(m==2)
{
for(i=0i<n/2i++)
{
if((i!=0)&&(i!=a-1)&&(i!=b-1)&&(i!=n-1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1])
swap(&Array[b-1][i],&Array[b-1][n-1-i])
}
}
swap(&Array[0][a-1],&Array[0][b-1])
swap(&Array[a-1][0],&Array[b-1][0])
swap(&Array[2][0],&Array[2][n-1])
swap(&Array[0][2],&Array[n-1][2])
}
break
case 1:
case 3:
/*穿心对调*/
for(i=0i<ni++)
for(j=0j<n/2j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0) /*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
}
else if(i>n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j])
}
}
}
/*End穿心对调*/
/*重排米字*/
for(i=0i<ni++)
{
tempArray1[i]=Array[i][i]
tempArray2[i]=Array[a][i]
}
QuickSort(tempArray1,0,n-1)
QuickSort(tempArray2,0,n-1)
for(i=0i<ni++)
{
Array[i][i]=tempArray2[i]
Array[a][i]=tempArray1[i]
}
for(i=0i<ni++)
{
tempArray1[i]=Array[i][n-1-i]
tempArray2[i]=Array[i][a]
}
QuickSort(tempArray1,0,n-1)
QuickSort(tempArray2,0,n-1)
for(i=0i<ni++)
{
Array[i][n-1-i]=tempArray2[i]
Array[i][a]=tempArray1[i]
}
/*End重排米字*/
if(m==3)
{
for(i=0i<n/2i++)
{
if((i!=a-1)&&(i!=b-1)&&(i!=a+1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1])
swap(&Array[a-1][i],&Array[a-1][n-1-i])
}
}
swap(&Array[a-1][a-1],&Array[a+1][a+1])
swap(&Array[a-1][b-1],&Array[a+1][b-1])
}
break
default:
break
}
return
}
void main()
{
int Ne[MAX_INDEX][MAX_INDEX]
int i,j,n
while(1)
{
printf("Please Input N (0 quit): ")
scanf("%d",&n)
if(n==0)
break
/*数组赋初值*/
for(i=0i<ni++)
for(j=0j<nj++)
Ne[i][j]=i*n+(j+1)
Huanf(Ne,n)
for(i=0i<ni++)
for(j=0j<nj++)
{
printf("%-4d",Ne[i][j])
if(j==n-1)
printf("\n\n")
}
printf("\n\n")
getch()
}
}
#include"stdio.h"#include"math.h"
int a[256][256]
int sum
int check()
void ins(int n)
void main(){
int i,j,n,k,t,p,x
scanf("%d",&n)
sum=(n*n+1)*n/2
if(n%2==1) //奇数幻方
ins(n)
if(n%4==2) { //单偶数幻方
k=n/2
ins(k)
for(i=0 i<k i++)
for(j=0 j<k j++){
a[i][j+k]=a[i][j]+2*k*k
a[i+k][j]=a[i][j]+3*k*k
a[i+k][j+k]=a[i][j]+k*k
}
t=(n-2)/4
for(i=0 i<k i++)
for(j=0 j<k j++){
if((j<t)&&(i<t)){
p=a[i][j]
a[i][j]=a[i+k][j]
a[i+k][j]=p
}if((j<t)&唤枯&(i>k-t-1)){
p=a[i][j]
a[i][j]=a[i+k][j]
a[i+k][j]=p
}if((i>=t&&i<=k-t-1)&&(j>=t&&j<t*2)){
p=a[i][j]
a[i][j]=a[i+k][j]
a[i+k][j]=p
}if(j>1&&j<=t){
p=a[i][j+k]
a[i][j+k]=a[i+k][j+k]
a[i+k][j+k]=p
}
}
}
if(n%4==0) { //双偶数幻方
x=1
for(i=0 i<n i++)
for(j=0 j<n j++)
a[i][j]=x++
for(i=0 i<n i++)
for(j=0 j<n j++){
if(i%4==0&&abs(i-j)%4==0)
for(k=0 k<4 k++)
a[i+k][j+k]=n*n-a[i+k][j+k]+1
else if(i%4==3&&(i+j)%4==3)
铅链尺 for(k=0 k<4 k++)
a[i-k][j+k]=n*n-a[i-k][j+k]+1
}
}
if(check(n)==1){
for(i=0 i<n i++){
for(j=0 j<n j++)
printf("%5d",a[i][j])
printf("\n")
}
}
}
int check(int n) { //检验是否是幻方
int i,j,sum1=0,sum2
for(i=0 i<n i++){
for(j=0 j<n j++)
sum1+=a[i][j]
if(sum1!=sum)
return 0
sum1=0
}
for(i=0 i<n i++){
for(j=0 j<n j++)
sum1+=a[i][j]
if(sum1!=sum)
return 0
sum1=0
}
for(sum1=0,sum2=0,i=0,j=0 i<n i++,j++){
sum1+=a[i][j]
sum2+=a[i][n-j-1]
}
if(sum1!=sum)
return 0
if(sum2!=sum)
槐高 return 0
else
return 1
}
void ins(int n) { //单偶数幻方的输入
int x,y,m
x=0
y=n/2
for(m=1 m<=n*n m++){
a[x][y]=m
if(m%n!=0){
x--
y++
if(x<0)x=x+n
if(y==n)y=n-y
}else{
x++
if(x==n)x=x-n
}
}
}
// c++语言实现
//(1)求奇数幻方
#include<iostream.h>
#include<iomanip.h>
int main(){
int n,x,y,tot=0,i,j,a[100][100]={0}
cout<<"请输入一个奇数"<<endl
cin>>n
a[i=n/2][j=0]=++tot
i--
j--
while(tot<=n*n){
i<0?i=n-1:i=i
j<0?j=n-1:j=j
if(a[i][j]){
i=x
j=y+1
}
a[i][j]=++tot
x=i
y=j
i--
j--
}
for(i=0 i<n i++){
for(j=0 j<n j++)
cout<<setw(3)<<a[i][j]
cout<<endl
}
return 0
}
//(2)求单偶幻方
#include<iostream.h>
#include<iomanip.h>
int main(){
int n,i=0,j=0,a[100][100],tot=0
cout<<"请输入4的倍数"<<endl
cin>>n
for(i=0 i<n i++)
for(j=0 j<n j++){
a[i][j]=++tot
}
for(i=0 i<n i++){
for(j=0 j<n j++){
if(i%4==j%4||i%4+j%4==3)
a[i][j]=n*n+1-a[i][j]
}
}
for(i=0 i<n i++){
for(j=0 j<n j++){
cout<<setw(4)<<a[i][j]
}
cout<<endl
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)