如何用C语言编写幻方?多谢回答

如何用C语言编写幻方?多谢回答,第1张

//分析:魔方阵有如下规律:

// 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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12319754.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存