题解 -NOIp2015 Day1T1 神奇的幻方(magic.cpp/.c/.pas)

题解 -NOIp2015 Day1T1 神奇的幻方(magic.cpp/.c/.pas)

主要思路

个人感觉,NOIP 提高组考这种题,实在是太水了,根据题意写个模拟就完事儿。
主要思路是:每填一个数字,就保存一下这个数的坐标。填下个数的时候,刚才保存的坐标就是 (K - 1) 的坐标。跟据此坐标判断 K 应该填到哪个位置。其中,填第一个数的时候需要特判。

代码

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int n,x,y;//x表示行,y表示列 
int mp[200][200];
int main()
{
    cin>>n;
    x = 1,y = (n+1)/2;
    mp[x][y]=1;//初始值x y为一行一列 
    for(int i=2;i<=n*n;i++)
    {
        if(x==1&&y!=n)//如果x在第一行且不在最后一列 
            x=n,y++; //把x放在最后一行,右移一列 
        else if(x!=1&&y==n)//如果X不在第一行 ,在最后一列 
            x--,y=1;//X在上一行,y在第一列 
        else if(x==1&&y==n)//如果x在第一行和最后一列 
            x++;//下一行 
        else if(!mp[x-1][y+1])// 
            x--,y++;//上方行减,列要加 
        else
            x++;//下方行加 
        mp[x][y]=i;//X行Y列是输入的这个数 
    }
    for(int i=1;i<=n;i++)//循环寻找
    {
        for(int j=1;j<=n;j++)
            printf("%d ",mp[i][j]);//输出不用讲
            printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/wangyixin_oier/article/details/81412851