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

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

今回の問題は以下です。

裏返せる可能性(斜め) | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

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

package main
import "fmt"
func main(){
    var h, w, sy, sx int
    fmt.Scan(&h, &w, &sy, &sx)
    
    g := make([][]rune, h)
    for i := 0; i < h; i++ {
        row := make([]rune, w)
        for j := 0; j < w; j++ {
            if i == sy && j == sx {
                row[j] = '!'
            } else {
                row[j] = '.'
            }
        }
        g[i] = row
    }
    
    dy := []int{1, 1, -1, -1}
    dx := []int{1, -1, 1, -1}
    for i := 0; i < 4; i++ {
        for j := 1;; j++ {
            ly, lx := sy + dy[i] * j, sx + dx[i] * j
            if ly >= 0 && lx >= 0 && ly < h && lx < w {
                g[ly][lx] = '*'
            } else {
                break
            }
        }
    }
    
    for i := 0; i < h; i++ {
        fmt.Println(string(g[i]))
    }
}

割とすっきり書けたと思います👍

と思って解説を見たら、もっとすっきりかけることに気付きました。

単純にabs(i - sy) == abs(j - sx)のときに陣地になるという風にすればよいですね。

package main
import "fmt"
func main(){
    var h, w, sy, sx int
    fmt.Scan(&h, &w, &sy, &sx)
    
    for i := 0; i < h; i++ {
        for j := 0; j < w; j++ {
            ly, lx := i - sy, j - sx
            if ly < 0 {
                ly = -ly
            }
            if lx < 0 {
                lx = -lx
            }
            if i == sy && j == sx {
                fmt.Printf("%s", "!")
            } else if ly == lx {
                fmt.Printf("%s", "*")
            } else {
                fmt.Printf("%s", ".")
            }
        }
        fmt.Println()
    }
}

これでよりすっきり書くことができました👍