代碼:輸出幻方(魔方陣)

//幻方
#include<stdio.h>
void f1(int n)//奇數
{
	int i,a[30][30];//a[j][k]
	int j=0,k=(n-1)/2;
	for(i=1;i<=n*n;i++)
	{
		a[j][k]=i;
		if(i%n==0)j++;
		else
		{
			if(j!=0)j--;
			else j=n-1;
			if(k!=(n-1))k++;
			else k=0;
		}
	}
	for(j=0;j<n;j++)
	{
		for(k=0;k<n;k++)
			printf("%d ",a[j][k]);
		printf("\n");
	}
}
void f2(int n)//雙偶
{
	int i=1,j,k,a[30][30],temp;//a[j][k]
	for(j=0;j<n;j++)
	{
		for(k=0;k<n;k++)
		{
			a[j][k]=i;
			i++;
		}
	}
	for(j=0;j<n/2;j++)
	{
		for(k=n/4;k<n/4*3;k++)
		{
			temp=a[j][k];
			a[j][k]=a[n-1-j][k];
			a[n-1-j][k]=temp;
		}
	}
	for(j=n/4+1;j<=n/4*3;j++)
	{
		for(k=0;j<n/2;j++)
		{
			temp=a[j][k];
			a[j][k]=a[j][n-1-k];
			a[j][n-1-k]=temp;
		}
	}
	for(j=0;j<n;j++)
	{
		for(k=0;k<n;k++)
			printf("%d ",a[j][k]);
		printf("\n");
	}
}
void f3(int n)//單偶
{
	int i,temp,a[30][30];//a[j][k]
	int m=(n-2)/4;
	int j=0,k=(n/2-1)/2;
	for(i=1;i<=n*n/4;i++)//FuZhi
	{
		a[j][k]=i;
		if(i%(n/2)==0)j++;
		else
		{
			if(j!=0)j--;
			else j=n/2-1;
			j%=(n/2);
			if(k!=(n/2-1))k++;
			else k=0;
			k%=(n/2);
		}
	}
	for(j=0;j<n/2;j++)
	{
		for(k=0;k<n/2;k++)
		{
			a[j+n/2][k+n/2]=a[j][k]+n*n/4;
			a[j][k+n/2]=a[j][k]+n*n/2;
			a[j+n/2][k]=a[j][k]+n*n*3/4;
		}
	}
	for(j=0;j<n/2;j++)//ac
	{
		if(j==(n-2)/4)
		{
			for(k=((n/2)-1)/2;k<(n/2-1)/2+m;k++)
			{
				temp=a[j][k];
				a[j][k]=a[j+n/2][k];
				a[j+n/2][k]=temp;
			}
		}
		else
		{
			for(k=0;k<m;k++)
			{
				temp=a[j][k];
				a[j][k]=a[j+n/2][k];
				a[j+n/2][k]=temp;
			}
		}
	}
	for(j=0;j<n/2;j++)//bd
	{
		for(k=n*3/4;k>n*3/4-(m-1);k--)
		{
			temp=a[j][k];
			a[j][k]=a[j+n/2][k];
			a[j+n/2][k]=temp;
		}
	}
	for(j=0;j<n;j++)//output
	{
		for(k=0;k<n;k++)
			printf("%d ",a[j][k]);
		printf("\n");
	}
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n%2==1)f1(n);
		else if(n%4==0) f2(n);
		else f3(n);
	}
	return 0;
}



written by Sneexy

思路參考:

日誌標題:《魔方陣算法及C語言實現》
日誌鏈接:http://furzoom.com/magic-square/
博客名稱:楓竹夢


下面這種方法來實現對奇幻方的處理更靈活(對應替換代碼f1)


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章