刷题日记—洛谷数组题单—幻方

幻方

image
如图
题目要求输入n,构建一个nn的幻方,很显然是一个二维数组,但是要怎么插入呢?插入必然要用到循环。是for还是while?
由题目条件可知,幻方的数值是从1——n
n,并且第一个数的位置已经确定,而第X个数是由X—1的位置来决定的,所以我们可以先在第X个数时得到X+1的位置,并且在下一次循环一开始就将其赋予其X+!,循环直至n*n
所以for循环更好一些,所以代码如下:

#include<iostream>
using namespace std;
const int a=40;
int ans[a][a]={0};
int main(){
    int n;
    int x=1,y=0;
    cin>>n;
    y=(n+1)/2;
    for(int i=1;i<=n*n;++i){
        ans[x][y]=i;
        if(x==1&&y==n||ans[x-1][y+1]){
         x++;
        }
        else if(x==1){
        x=n;
        y++;
            
        }
      else if(y==n){
          y=1;
          x--;

          
      }
       else{
           x--;
           y++;
       }
      

        
    }
    for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                cout<<ans[i][j]<<' ';



                
            }
        cout<<endl;


        
    }
    


    return 0;
}

这里有个细节,由于条件1和条件2是条件3的分条件,可以先判条件3,这样条件1,条件2就更好判了;并且由于条件3和条件4的后半段条件的运算结果一致,并且条件4的后半段与条件1和条件2互斥,所以可以将条件3和条件4的后半段合并,使代码显得更加简洁

posted @ 2025-10-25 20:39  MaoS1mple  阅读(8)  评论(0)    收藏  举报