# Array# Simulation# Greedy# Math

b351 - 幻方(魔方陣)之一:奇N 階

🔗 前往 ZeroJudge 原題

題目描述

題目要求生成一個奇數階的幻方(魔方陣),並輸出指定位置的數字。幻方是一個正方形的數字陣列,其行、列和對角線上的數字和都相等。題目給定生成幻方的規則,從中心開始填入數字,並按照特定的規則移動到下一個位置。

解題思路

本題的核心是模擬幻方生成過程。根據題目描述,我們從中心位置開始填入數字 1,然後按照右上方的規則移動到下一個位置。如果移動後的位置超出邊界或已經填有數字,則按照題目規定的方式調整位置。這個過程重複進行,直到填滿所有數字。

程式碼中,s[i][j] 是一個二維陣列,用於儲存幻方的數字。xy 分別表示當前位置的行和列。no 表示當前要填入的數字。程式碼首先初始化陣列,然後從中心位置開始填入數字,並按照題目規定的規則移動位置,直到找到合適的位置。最後,程式碼輸出指定位置的數字。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(n^2)

程式碼

#include <iostream>
using namespace std;
int q,xt,yt,n;
bool s[5005][5005];
int main(){
	cin >> q;
	while(q--){
		cin >> n >> xt >> yt;
		int x=1,y=n/2+1,no=1;
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				s[i][j]=0;
		s[x][y]=1;
		while(x!=xt||y!=yt){
			if(x-1>0&&y-1>0){
				if(!s[x-1][y-1]){ 
					--x;
					--y;
				} 
				else{
					++x;
				}
			}
			else if(x-1==0&&y-1>0){
				if(!s[n][y-1]){ 
					x=n;
					--y;
				} 
				else{
					++x;
				}
			}
			else if(x-1>0&&y-1==0){
				if(!s[x-1][n]){ 
					--x;
					y=n;
				} 
				else{
					++x;
				}
			}
			else{
				++x;
			}
			s[x][y]=1;
			++no;
		}
		cout << no << "\n";
	}
}

Discussion