[1987] 알파벳

toru·2022년 9월 18일
0
// 와 이건 어떻게 생각해 낸거야.
let p = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r,c) = (p[0],p[1])
let d = [(0,1),(0,-1),(1,0),(-1,0)]
var arr = [[Int]]()
var result = 0

for _ in 0..<r {
    arr.append(readLine()!.map{Int($0.asciiValue!)-65})
}

dfs(0, 0, 1, 1 << arr[0][0])  // 고유번호 생성.
print(result)

func dfs(_ x:Int,_ y:Int,_ digit:Int,_ bit:Int) {
    result = result > digit ? result : digit
    
    for (dx,dy) in d {
        let (nx, ny) = (dx+x, dy+y)
        if 0<=nx, nx<r, 0<=ny, ny<c {
            let nb = 1 << arr[nx][ny]
            if nb & bit == 0 {  	// 한번도 가지 않은 곳이라면
                dfs(nx, ny, digit+1, bit | nb)  // visited = true
            }
        }
    }
}
// 시간초과
let p = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r,c) = (p[0],p[1])
let d = [(0,1),(0,-1),(1,0),(-1,0)]
var visited = Array(repeating: false, count: 26)
var arr = [[Int]]()
var result = 0

for _ in 0..<r {
    arr.append(readLine()!.map{Int($0.asciiValue!)-65})
}

func dfs(_ x:Int,_ y:Int,_ cnt:Int) {
    if result < cnt {
        result = cnt
    }
    
    for (dx,dy) in d {
        let nx = dx + x
        let ny = dy + y

        if 0<=nx, nx<r, 0<=ny, ny<c {
            if !visited[arr[nx][ny]] {
                visited[arr[nx][ny]] = true
                dfs(nx, ny ,cnt+1)
                visited[arr[nx][ny]] = false
            }
        }
    }
    
}
visited[arr[0][0]] = true
dfs(0,0,1)
print(result)
profile
iOS

0개의 댓글