結果

問題 No.217 魔方陣を作ろう
ユーザー fmhrfmhr
提出日時 2015-05-27 07:42:15
言語 Go
(1.23.4)
結果
AC  
実行時間 2 ms / 5,000 ms
コード長 1,824 bytes
コンパイル時間 12,648 ms
コンパイル使用メモリ 241,748 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-10-10 18:47:58
合計ジャッジ時間 12,261 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 18
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import (
	"fmt"
)

func doubleSliceInt(y, x int) [][]int{
	mslice := make([][]int, y)
	for i:= range mslice{
		mslice[i] = make([]int, x)
	}
	return mslice
}

func odd(N int, z [][]int) [][]int{
	y := 0
	x := N / 2
	for i := 0; i < N*N; i++ {
		z[y][x] = i + 1
		y2 := (y + N - 1) % N
		x2 := (x + 1) % N
		if z[y2][x2] != 0 {
			y2 = (y + 1) % N
			x2 = x
		}
		y = y2
		x = x2
	}
	return z
}

func print(z [][]int){
	for i := range z {
		for j:= range z[i] {
			fmt.Print(z[i][j], " ")
		}
	fmt.Println("")
	}
}

func main() {
	var N int
	fmt.Scan(&N)
	z := doubleSliceInt(N, N)
//	z := make([][]int, N)
//	for i := 0; i < N; i++ {
//		z[i] = make([]int, N)
//	}
	if N%2 == 1 {
		z = odd(N, z)
	} else if N%4 == 0 {
		for i := 0; i < N; i++ {
			for j := 0; j < N; j++ {
				if (i%4==j%4 || i%4+j%4==3) {
					z[i][j] = N*i+j+1
				} else {
					z[i][j] = N*N-(N*i+j)
				}
			}
		}
	} else{
		n := (N-2)/4
		seed := doubleSliceInt(2*n+1, 2*n+1)
//		seed := make([][]int, 2*n+1) //+1
//		for i:= range seed{
//			seed[i] = make([]int, 2*n+1)
//		}
		seed = odd(2*n+1, seed)

		LUX := doubleSliceInt(2*n+1+1, 2*n+1)
//		LUX := make([][]int, 2*n+1+1) //+1
//		for i:= range LUX{
//			LUX[i] = make([]int, 2*n+1)
//		}

		for i:=0; i<2*n+1; i++{
			LUX[(2*n+1)/2+1][i] = 1
		}
		for i:=(2*n+1)/2+2; i<(2*n+1)+1; i++{
			for j:=0; j<(2*n+1); j++{
				LUX[i][j] = 2
			}
		}
		//print(LUX)
		LUX[N/4][N/4] = 1
		LUX[1 + N/4][N/4] = 0
		//print(LUX)
		L := [2][2]int{{4,1},{2,3}}
		U := [2][2]int{{1,4},{2,3}}
		X := [2][2]int{{1,4},{3,2}}
		LUXmat := [3][2][2]int{L,U,X}
		for x:=0; x<N/2; x++{
			for y:=0; y<N/2; y++{
				val := (seed[x][y] - 1) * 4
				idx := LUX[x][y]
				for a:=0;a<2;a++{
					for b:=0;b<2;b++{
						z[2 * x + a][2 * y + b] = LUXmat[idx][a][b] + val
					}
				}

			}
		}

	}
	print(z)
}
0