2889. 魔方阵

Li Dao

模拟

include

using namespace std;
int n;
int tu[100][100];
void Go(int& xx,int& yy)
{
if(xx==n) xx=1;
else ++xx;
if(yy==1) yy=n;
else –yy;
return;
}
void solve()
{
memset(tu,0,sizeof(tu));
int x=n,y=(n+1)/2;
tu[x][y]=1;
for(int i=2;i<=n*n;i++)
{
int x1=x,y1=y;
Go(x,y);
if(tu[x][y]!=0 || (x1==n && y1==1))
{
x=x1==1?n:x1-1;
y=y1;
}
tu[x][y]=i;
}
for(int i=1;i<=n;i++)
{
int ff=1;
for(int j=1;j<=n;j++)
{
if(ff) ff=0;
else cout<<’ ‘;
cout<<tu[i][j];
}
cout<>n) solve();
return 0;
}

10175102262 LarsPendragon

注意判断下一个位置有数字后,返回时横纵坐标依旧应该进行判断。
例如:

      for(x=1; x<=n*n; x++)
        {
            a[i][j]=x;
            if(i==n-1)
                i=0;
            else
                i++;
            if(j==0)
                j=n-1;
            else
                j--;
            if(a[i][j]!=0){
                if(j==n-1)
                    j=0;
                else
                    j++;
                if(i==1)
                    i=n-1;
                else if(i==0)
                    i=n-2;
                else
                    i-=2;
            }
        }
Saitama
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    while(cin >> n)
    {
        int a[n][n];
        memset(a, 0, sizeof(a));
        a[n - 1][n / 2] = 1;
        int k = 2;
        int x = n - 1, y = n / 2;
        while(k <= n * n)
        {
            if(x == n - 1)
                x = 0;
            else
                x++;
            if(y == 0)
                y = n - 1;
            else
                y--;
            if(a[x][y] == 0)
                a[x][y] = k++;
            else
            {
                if(x == 0)
                    x = n - 1;
                else
                    x--;
                if(y == n - 1)
                    y = 0;
                else
                    y++;
                if(x == 0)
                    x = n - 1;
                else
                    x--;
                a[x][y] = k++;

            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
                cout << a[i][j] << " ";
            cout << endl;
        }
    }
    return 0;
}
yuanfang

刚开始也没看到hint

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int nums[100][100];
int main() {
    int n;
    while (cin >> n) {
        memset(nums, 0, sizeof(nums));
        int x = n;
        int y = n / 2 + 1;
        int v = 1;
        while (v <= n * n) {
            nums[x][y] = v++;
            ++x;
            --y;
            if (x > n) {
                x = 1;
            }
            if (y < 1) {
                y = n;
            }
            if (nums[x][y] != 0) {
                x -= 2;
                y += 1;
                if (x < 1 && y > n) {
                    x = n - 1;
                    y = 1;
                }
            }
        }
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                printf("%d%c", nums[i][j], j < n ? ' ' : '\n');
            }
        }
    }
    return 0;
}
Master X

随便讲讲怎么模拟吧……
从1开始,填完一个数后往左下填。遇到填好的数上移一格

爱丽丝_青贝尔克

题目不是给hint了吗

Master X

来人把她拖出去(老实人孤立她……

你当前正在回复 博客/题目
存在问题!