ZZULIOJ:1203: 做幻方

题目描述

Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐_ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.

输入

每行一个奇数N(0< N < 30),输入0结束

输出

输入一个奇数,输出一个幻方,顺序参照样板输出;同一列的数右对齐,数与数用一个空格分开;输出完以后加一个回车。

样例输入

5
1
0

样例输出

11 18 25 2 9
10 12 19 21 3
4 6 13 20 22
23 5 7 14 16
17 24 1 8 15

1

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[30][30];

int main()
{
	int n, i, x, y, j;
	while (cin >> n)
	{
		for (i = 0; i < n; ++i)
		{
			for (j = 0; j < n; ++j)
				a[i][j] = 0;
		}
		x = n - 1;
		y = (n - 1) / 2;
		a[x][y] = 1;
		for (i = 2; i <= n*n; ++i)
		{
			if (x < n - 1 && y < n - 1 && a[x + 1][y + 1] == 0)
			{
				x++;
				y++;
				a[x][y] = i;
			}
			else if (x < n - 1 && y < n - 1 && a[x + 1][y + 1] != 0)
			{
				x--;
				a[x][y] = i;
			}
			else if (x == n - 1 && y < n - 1)
			{
				x = 0;
				y++;
				a[x][y] = i;
			}
			else if (x < n - 1 && y == n - 1)
			{
				x++;
				y = 0;
				a[x][y] = i;
			}
			else if (x == n - 1 && y == n - 1)
			{
				x--;
				a[x][y] = i;
			}
		}
		for (i = 0; i < n; ++i)
		{
			for (j = 0; j < n; ++j)
			{
				if (n * n >= 100)
					printf("%3d ", a[i][j]);
				else if (n * n >= 10 && n * n <= 100)
					printf("%2d ", a[i][j]);
				else if (n * n < 10)
					printf("%1d ", a[i][j]);
			}
			printf("\n");
		}
		printf("\n");
	}
	return 0;
}
发布了35 篇原创文章 · 获赞 0 · 访问量 1275
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览