こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

【マップの扱い 2】マップの書き換え・縦横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

以下のように実装しました。

(解答例のpythonコードをgoに書き換えただけですが…)

package main
import "fmt"
func main(){
    var h, w, d int
    fmt.Scan(&h, &w, &d)
    g := make([][]int, h)
    for i := 0; i < h; i++ {
        g[i] = make([]int, w)
    }
    min := func(a, b int) int {
        if a > b {
            return b
        } else {
            return a
        }
    }
    c := 1
    switch d {
        case 1:
            for i := 0; i < h; i++ {
                for j := 0; j < min(w, i + 1); j++ {
                    g[i - j][j] = c
                    c++
                }
            }
            for i := 1; i < w; i++ {
        		for j := 0; j < min(h, w - i); j++ {
        			g[h - 1 - j][i + j] = c
        			c++
        		}
        	}
        case 2:
            for i := 0; i < h; i++ {
                for j := 0; j < w; j++ {
                    ty, tx := i, j
                    g[ty][tx] = c
                    c++
                }
            }
        case 3:
            for i := 0; i < w; i++ {
                for j := 0; j < h; j++ {
                    ty, tx := j, i
                    g[ty][tx] = c
                    c++
                }
            }
        case 4:
            for i := 0; i < w; i++ {
                for j := 0; j < min(h, i + 1); j++ {
                    g[j][i - j] = c
                    c++
                }
            }
            for i := 1; i < h; i++ {
        		for j := 0; j < min(w, h - i); j++ {
        			g[i + j][w - 1 - j] = c
        			c++
        		}
        	}
    }
    for i := 0; i < h; i++ {
        for j := 0; j < w; j++ {
            fmt.Printf("%d", g[i][j])
            if j < w - 1 {
                fmt.Print(" ")
            }
        }
        fmt.Println()
    }
}

これに関してはなんか複雑で自分でよくわかっていません。。。よくないとはわかりつつも。。。

では今回はこれで👍