0
点赞
收藏
分享

微信扫一扫

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

吴wuwu 2022-02-04 阅读 53

魔法格子代码

#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)//如果向下越界,就恢复为第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 条评论