C语言——输出“魔方阵”(带解析)

魔方阵:每一行  每一列  对角线之和均相等,要求输出n阶魔方阵

总结的五大规律:

1.把  1  放第一行中间

2.行-1   列+1

3. if(上个数1行n列)   放它下边 (i=i+2;   j=j-1)这样理解 回溯两次

4.else{

     if  {上个数第1行}    下个数n行

     if  {上个数第n列}    下个数第1行

}

   if没数            放数

5.else 有数      放他下边

 

调试

结果图:

 。。。。。。。。。。。。。。

 

代码:

#include<stdio.h>
int main(){
	int a[16][16],i,j,k,n;
	scanf("%d",&n);
	
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			a[i][j]=0;	
		}
	}
	
	j=n/2+1;
	a[1][j]=1;
	for(k=2;k<=n*n;k++){
		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=1;i<=n;i++){
		for(j=1;j<=n;j++){
			printf("%5d ",a[i][j]);
		}
		printf("\n");	
	}
	
	return 0;
}

实在理解不了:

直接暴力穷举

#include "stdio.h"
int match(int i,int j,int k,int l,int m,int n,int o,int p,int q)
{
    /*判断变量i-q是否互不相等,是则返回1,不是则返回0*/
    if(i!=j&&i!=k&&i!=l&&i!=m&&i!=n&&i!=o&&i!=p&&i!=q
         &&j!=k&&j!=l&&j!=m&&j!=n&&j!=o&&j!=p&&j!=q
            &&k!=l&&k!=m&&k!=n&&k!=o&&k!=p&&i!=q
                    &&l!=m&&l!=n&&l!=o&&l!=p&&l!=q
                     &&m!=n&&m!=o&&m!=p&&m!=q
                              &&n!=o&&n!=p&&n!=q
                                     &&o!=p&&o!=q
                                          &&p!=q)
    return 1 ;
    else return 0;
}


int justic(int i,int j,int k,int l,int m,int n,int o,int p,int q)
{
    /*判断变量i-q的这种排列是否满足魔幻方阵的要求,满足返回1,不满足返回0*/
    if(i+j+k == l+m+n && i+j+k == o+p+q &&
    i+l+o == j+m+p && i+l+o == k+n+q
    && i+m+q == k+m+o)return 1;
    else return 0;
}

void getMatrix(){
    int i,j,k,l,m,n,o,p,q;
    for(i=1;i<=9;i++)
        for(j=1;j<=9;j++)
            for(k=1;k<=9;k++)
                for(l=1;l<=9;l++)
                    for(m=1;m<=9;m++)
                        for(n=1;n<=9;n++)
                            for(o=1;o<=9;o++)
                                for(p=1;p<=9;p++)
                                     for(q=1;q<=9;q++)
                                     {
                                        if(match(i,j,k,l,m,n,o,p,q))
                                        if(justic(i,j,k,l,m,n,o,p,q))
                                        {
                                            printf("%d %d %d\n",i,j,k);  /*输出结果*/
                                            printf("%d %d %d\n",l,m,n);
                                            printf("%d %d %d\n",o,p,q);
                                            printf("\n");
                                            return;
                                        }                                /*返回*/
                                     }

}
main()
{
    getMatrix() ; /*输出一个三阶魔幻方阵*/
    getche();
}

太费时间了。。。

  • 28
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值