結果
問題 | No.217 魔方陣を作ろう |
ユーザー |
![]() |
提出日時 | 2020-09-16 22:28:07 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 3,256 bytes |
コンパイル時間 | 11,766 ms |
コンパイル使用メモリ | 229,368 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-22 03:41:03 |
合計ジャッジ時間 | 12,785 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 18 |
ソースコード
package mainimport ("bufio""fmt""os""sort""strconv")func out(x ...interface{}) {fmt.Println(x...)}var sc = bufio.NewScanner(os.Stdin)func getInt() int {sc.Scan()i, e := strconv.Atoi(sc.Text())if e != nil {panic(e)}return i}func getInts(N int) []int {ret := make([]int, N)for i := 0; i < N; i++ {ret[i] = getInt()}return ret}func getString() string {sc.Scan()return sc.Text()}// min, max, asub, absなど基本関数func max(a, b int) int {if a > b {return a}return b}func min(a, b int) int {if a < b {return a}return b}func asub(a, b int) int {if a > b {return a - b}return b - a}func abs(a int) int {if a >= 0 {return a}return -a}func lowerBound(a []int, x int) int {idx := sort.Search(len(a), func(i int) bool {return a[i] >= x})return idx}func upperBound(a []int, x int) int {idx := sort.Search(len(a), func(i int) bool {return a[i] > x})return idx}func makeEven(n int) [][]int {a := make([][]int, n)for i := 0; i < n; i++ {a[i] = make([]int, n)}x, y := n/2-1, 1cnt := 0for cnt != n*n {prex := xprey := yx++y--if x >= n {x = 0}if y < 0 {y = n - 1}if a[y][x] != 0 {x = prexy = prey + 1if y >= n {y = 0}}cnt++a[y][x] = cnt}return a}func make44(n int) [][]int {a := make([][]int, n)for i := 0; i < n; i++ {a[i] = make([]int, n)}cnt := 1for y := 0; y < n; y++ {for x := 0; x < n; x++ {switch y % 4 {case 0:fallthroughcase 3:if x%4 == 0 || x%4 == 3 {a[y][x] = cnt}case 1:fallthroughcase 2:if x%4 == 1 || x%4 == 2 {a[y][x] = cnt}}cnt++}}cnt = n * nfor y := 0; y < n; y++ {for x := 0; x < n; x++ {switch y % 4 {case 1:fallthroughcase 2:if x%4 == 0 || x%4 == 3 {a[y][x] = cnt}case 0:fallthroughcase 3:if x%4 == 1 || x%4 == 2 {a[y][x] = cnt}}cnt--}}return a}func fill(b [][]int, x, y, t int, n []int) {x = x * 2y = y * 2b[y][x] = n[0] + tb[y][x+1] = n[1] + tb[y+1][x] = n[2] + tb[y+1][x+1] = n[3] + t}func make4n2(n int) [][]int {nn := (n - 2) / 4nnn := 2*nn + 1a := makeEven(nnn)for y := 0; y < nnn; y++ {for x := 0; x < nnn; x++ {a[y][x]--a[y][x] *= 4}}b := make([][]int, n)for i := 0; i < n; i++ {b[i] = make([]int, n)}for y := 0; y < nnn; y++ {for x := 0; x < nnn; x++ {if y < nn {fill(b, x, y, a[y][x], []int{4, 1, 2, 3})} else if y == nn {if x == nn {fill(b, x, y, a[y][x], []int{1, 4, 2, 3})} else {fill(b, x, y, a[y][x], []int{4, 1, 2, 3})}} else if y == nn+1 {if x == nn {fill(b, x, y, a[y][x], []int{4, 1, 2, 3})} else {fill(b, x, y, a[y][x], []int{1, 4, 2, 3})}} else {fill(b, x, y, a[y][x], []int{1, 4, 3, 2})}}}return b}func main() {sc.Split(bufio.ScanWords)N := getInt()var a [][]intif N%2 == 1 {a = makeEven(N)}if N%4 == 0 {a = make44(N)}if N%4 == 2 {a = make4n2(N)}for y := 0; y < N; y++ {for x := 0; x < N; x++ {fmt.Print(a[y][x], " ")}out()}}