1180魔方阵(每日学习)宁波大学OJ

 

题目描述

 

输出魔方阵,所谓魔方阵就是指这样的方阵,它的每一行每一列和对角线之和都相等,例如,三阶魔方阵为

8 1 6

3 5 7

4 9 2

 要求输出由1—n^2之间的自然数构成的魔方阵。

输入要求

输入该方阵的阶数n(n<=15且n为奇数)。

输出要求

输出该n阶魔方阵,两个数字之间用空格间隔

输入样例

3

输出样例

8 1 6
3 5 7
4 9 2

提示

 

由于魔方阵的填法有很多种,这里给出一种填法:

1.将1放在第一行的最中央。

2.接下来的每个数字都放在前一个数字的右上方。如果右上方被占,则放在前一个数字的下面。

请按照这种方法输出对应的魔方阵!

代码

#include<stdio.h>//
int main(void){
 int n,x,y,a[20][20]={0},i,j,k;//先在1个20*20的二维数组里全部存储0 
 scanf("%d",&n);
 x=(n-1)/2;//赋初值,从中间的位置开始 
 y=0;//从第0行开始 
 a[y][x]=1;//先令第 0行的中间位置为1 
 //核心赋值部分,遍历输入部分 
 //需要循环输入的次数n*n,已经输入1,所以从2开始 
 for(i=2;i<=n*n;i++)
 {//先记录下上次已经遍历点的列和行数分别存储给j和k 
  j=x;k=y;
  x+=1;y-=1;//遍历的规律,列数向右移动,行数向上移动 
  if(y==-1&&x<=n-1)//y==-1向上越界 
  {y=n-1;}//y恢复从最下面开始向上走 
  else if(y>=0&&x==n)//x==n横向越界(向右) 
  {x=0;}//x恢复从最左边开始向右走 
  else if(y==-1&&x==n)//x==n横向越界(向右)同时y==-1(向上)越界 
  {x=0;y=n-1;}//y恢复从最下面开始向上走,x恢复从最左边开始向右走  
  //如果不等于0,说明已经被遍历过 
  if(a[y][x]!=0)//就下一次选择移动到  上一次遍历过的  点的正下方 
  {
   x=j;
   y=k+1;
   if(y==n)//在y=k+1之后,如果向下越界,就恢复为第0行 
   {
    y=0;
   }
  }
  a[y][x]=i;//赋值每一次i递增后都赋值给每一个正在遍历的位置 
 }
 //遍历输出部分和格式要求(按照正方形的格式输出) 
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
  {
   printf("%d",a[i][j]);//如果当n大一点,可以在把%d改成%5d或者其他,右对齐
   if(j==n-1)
   {printf("\n");}
   else
   {printf(" ");}
  }
 }
}
 
//本代码借鉴其他同学的,作者在此基础是注释说明,感谢更多朋友分享源代码

每日学习 (nbuoj.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值