1. 程式人生 > >百練 神奇的幻方(二維陣列水題)

百練 神奇的幻方(二維陣列水題)

神奇的幻方

總時間限制: 
1000ms 
記憶體限制: 
65535kB
描述

幻方是一個很神奇的N*N矩陣,它的每行、每列與對角線,加起來的數字和都是相同的。
我們可以通過以下方法構建一個幻方。(階數為奇數)
1.第一個數字寫在第一行的中間
2.下一個數字,都寫在上一個數字的右上方:
    a.如果該數字在第一行,則下一個數字寫在最後一行,列數為該數字的右一列
    b.如果該數字在最後一列,則下一個數字寫在第一列,行數為該數字的上一行
    c.如果該數字在右上角,或者該數字的右上方已有數字,則下一個數字寫在該數字的下方

輸入
一個數字N(N<=20)
輸出
按上方法構造的2N-1 * 2N-1的幻方
樣例輸入
3
樣例輸出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
#include<iostream>
#include<cstring>


using namespace std;

int n;
int mp[200][200];
int cnt;
int main()
{
	cin>>n;
	int x,y,nx,ny;
	x=0;y=(2*n-1)/2;
	mp[x][y]=++cnt;
	while(true)
	{
		if(cnt==(2*n-1)*(2*n-1))break;
		int ny=(y+1)%(2*n-1);
		if(x==0)nx=2*n-2;
		else nx=x-1;
		
		if(x==0&&y==2*n-2){
			nx=1;ny=2*n-2;
			mp[nx][ny]=++cnt;
		}
		else if(mp[nx][ny]){
			nx=(x+1)%(2*n-1);ny=y;
			mp[nx][ny]=++cnt;
		}
		else mp[nx][ny]=++cnt;
		
		x=nx;y=ny;
	}
	for(int i=0;i<(2*n-1);i++)
	{
		for(int j=0;j<(2*n-1);j++)
		{
			if(j==0)cout<<mp[i][j];
			else cout<<" "<<mp[i][j];
		}
		cout<<endl;
	}
	return 0;
}