P2615 [NOIP2015 提高组] 神奇的幻方

在这里插入图片描述
一种比较蠢的适合初学者的根据题意写的代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int a[40][40];
int main(){
    
    
    int n,x[1600],y[1600];//x,y用来储存某个值的行数(从上到下)与列数(从左往右)
    cin>>n;
    for(int i=0;i<=n;i++){
    
    
        a[0][i]=260408,a[i][0]=260408;//初始化第一行与第一列
    }
    a[1][n/2+1]=1;//填1
    x[1]=1,y[1]=n/2+1;//1的坐标
    for(int i=2;i<=n*n;i++){
    
    //按要求依次填入:
    
    //若(K-1)在第一行但不在最后一列,则将 K 填在最后一行,(K-1)所在列的右一列:
        if(x[i-1]==1 && y[i-1]!=n){
    
    
            a[n][y[i-1]+1]=i;
            x[i]=n,y[i]=y[i-1]+1;
        }
        
	//若(K-1)在最后一列但不在第一行,则将 K 填在第一列,(K-1)所在行的上一行:
        else if(y[i-1]==n && x[i-1]!=1){
    
    
            a[x[i-1]-1][1]=i;
            x[i]=x[i-1]-1,y[i]=1;
        }
        
	//若(K-1)在第一行最后一列,则将 K 填在(K-1)的正下方:
        else if(a[1][n]==i-1){
    
    
            a[2][n]=i;
            x[i]=2,y[i]=n;
        }

	//若(K-1)既不在第一行,也不在最后一列,如果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,否则将 K 填在(K-1)的正下方:
        else if(x[i-1]!=1 && y[i-1]!=n){
    
    
            if(a[x[i-1]-1][y[i-1]+1]==0){
    
    
                a[x[i-1]-1][y[i-1]+1]=i;
                x[i]=x[i-1]-1,y[i]=y[i-1]+1;
            }
            else{
    
    
                a[x[i-1]+1][y[i-1]]=i;
                x[i]=x[i-1]+1,y[i]=y[i-1];
            }
        }
    }

	//打印结果:
    for(int i=1;i<=n;i++)
    {
    
    
        for(int j=1;j<=n;j++){
    
    
            cout<<a[i][j]<<' ';
        }
    	cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/interestingddd/article/details/114297362