ACM-5

来源:互联网 发布:ssr centos 一键 编辑:程序博客网 时间:2024/05/17 00:08

ACM-1998

奇数阶魔方

没有什么具体问题:

知道算法即可

 

注意:杭电的编译器--要把所有变量的声明都放在最前面

          注意输出格式

 

具体代码如下:

#include <stdio.h>

int main()
{
 int num;
 int n;
 int result[20][20];
 int i,j;
 int k;
 scanf("%d",&num);
 while(num--){
  scanf("%d",&n);
     if(n%2==0)continue;
  for(i =0;i<20;i++){
   for(j = 0;j<20;j++){
    result[i][j] = -1;
   }
  }
  i = 0;
  j = n/2;
  result[i][j]=1;
  /************************************************************************
  N为奇数时
  (1) 将1放在第一行中间一列;
  (2) 从2开始直到n×n为止各数依次按下列规则存放:
  向右上方存放
     每一个数存放的行比前一个数的行数减1,列数加1
     (3) 如果行列范围超出矩阵范围,则回绕。
     假如x在第1行,则x+1应放在最下一行即第n行,列数同样为x所在的列数加1;
     假如x在第n列,则x+1应放在第一列,行数同样为x所在的行数减1。
  (4) 如果按上面规则确定的位置上已有数,或者上一个数是第1行第n列时,
     则把下一个数放在上一个数的下面。
        ************************************************************************/
  for(k = 2;k<=n*n;k++){
   if(i==0&&j==n-1){
    i=i+1;
   }else{
    int x,y;
    x = i;
    y = j;
    i = i-1;
    j = j+1;
    if(i<0){
     i = n-1;
    }
    if(j>n-1){
     j = 0;
    }
    if(result[i][j] !=-1){
     i = x+1;
     j = y;
    }
   }
   result[i][j]=k;
  }
  for(i=0;i<n;i++){
   for(j=0;j<n;j++){
    printf("%4d",result[i][j]);
   }
   printf("\n");
  }
 }
 return 0;
}

0 0