N 퀸즈, X by Y 보드 결정 문제 인터뷰 질문


10

나는 오늘 인터뷰에서 다음과 같은 질문을 받았으며 그 이후로 그것에 대해 생각하고 있습니다. 답변을받지 못해 온라인으로 솔루션을 찾을 수 없었습니다.

Y 및 N 퀸으로 X 크기의 체스 판이 주어지면,이 퀸들이 서로 공격 할 수 없도록 보드에 배치 할 수 있는지 확인하십시오.

퀸이 2 개인 2 x 3 보드에는 솔루션이 있으므로 알고리즘이 true를 반환합니다.

Q . .
. . Q

예를 들어 종이로 해결하는 방법뿐만 아니라이 퍼즐에 대한 프로그래밍 접근법을 찾고 있습니다.


다른 검색 휴리스틱과 마찬가지로 Best First Search 는 확실히 옵션입니다.
Jason

2
최악의 면접 질문 중 하나에 임명 - 소프트웨어하지 않는 한 그들이 완전히 관련이있는 경우, 역 추적 솔루션에 의존하는 작업
스티븐 A. 로우

1
면접관은 공정하게 말하면 이것은 단순히 추가 신용 종류의 것이라고 말했습니다. 인터뷰의 나머지 부분은 합법적 인 IMO였습니다. 나는 단지 궁금했다.
면접관

그가 Caleb의 답변에서 사실을 사용하여 역 추적 또는 O (1) 솔루션을 찾은 것으로 생각한다면 테스트 일 수 있습니다. 간단한 것들을 프로그래밍하는 능력은 직업에서 필요한 모든 것이 아닙니다.
소펠

과제 과제는 여기에서 명시 적으로 범위를 벗어납니다.
jwenting

답변:


16

이것은 프로그래밍 관점에서 볼 때 매우 흥미로운 문제는 아닙니다. 다음과 같이 모든 배열을 시도하는 재귀 알고리즘을 생각해 볼 수 있습니다.

bool try_queens(Board board, int n)
{
    if (n == 0) {
        // no queens left to place, so we're done
        return true
    }
    // try each open position until we find one that works
    for each position on the board {
        if (is_empty(board, position) and not is_attacked(board, position)) {
            place_queen(board, position)
            if (try_queens(board, n-1)) {
                return true
            }
            remove_queen(board, position)
        }
    }
    // if we get this far, there's no available position
    return false
}

main()
{
    initialize board(X,Y)
    return try_queens(board, N)
}

문제를 조금 생각하면 X <N 또는 Y <N 인 보드에 N 퀸을 맞추는 방법이 없다는 것을 알게 될 것입니다. 왜냐하면 적어도 두 명의 여왕이 같은 순위 또는 파일로 끝나야하기 때문입니다. 그러므로 그들은 서로를 공격 할 것입니다. n-queens 문제에 대해 읽으면 N> 3의 NxN 보드에 N 퀸을 배치하는 것이 항상 가능하다는 것을 빨리 알게 될 것입니다. 이제 우리는 (X <N 또는 Y <N) (X> = N 및 Y> = N, N> 3)에 대해 YES입니다. 남은 것은 특별한 경우입니다.

  • N = 1 (예)
  • N = 2 (X> = 2 및 Y> 2의 경우 예 또는 그 반대)
  • N = 3 (X> = 3 및 Y> 3의 경우 예 또는 그 반대)

이제 우리의 멋진 재귀 함수는 N을 X와 Y를 비교하고 미리 준비된 결과를 반환하는 간단한 함수가됩니다. 일정한 시간에 답변을 얻을 수 있기 때문에 성능 관점에서 훌륭합니다. 프로그래밍 관점에서는 그리 좋지 않습니다.이 시점에서 재귀 함수를 작성하는 능력보다 퍼즐을 얼마나 잘 해결할 수 있는지에 대한 질문이 있다는 것을 알고 있기 때문입니다.

(그리고 소년 오 소년, 나는 정말 똑똑한 바지 답변에서 약간의 실수를하지 않았기를 바랍니다. ;-)


That's great from a performance point of view, since you can get an answer in constant time. It's not so great from a programming point of view because you realize, at this point, that the question is really more about how well you can solve puzzles than it is about your ability to write a recursive function.나는 실제로 면접관이 O (1) 솔루션을 기다리고 있다고 생각한다. 왜냐하면 많은 사람들에게 궁극적으로 더 좋고 명확하지 않기 때문이다. nxn queen 문제는 모든 프로그래밍 과정에서 재귀에 대한 연습으로 발생합니다. 많은 사람들이 그 문제를 다시 볼 때 더 깊이 생각하지 않을 것입니다.
Sopel

4

면접관이 문제에 대한 코드를 작성하도록 요청했다면 그것이 불공평하다고 생각합니다. 알고리즘에는 작업이 필요합니다. 그러나 면접관에게 당신이 사용해야 할 수업, 방법 또는 일부 개념 또는 유사한 것을 보여 주려는 아이디어라면 공정한 질문 일 수 있습니다.

이 문제는 고전적인 컴퓨터 과학 문제이며 많은 책에서 논의됩니다. 애니메이션과 12 가지 솔루션이 포함 된 훌륭한 설명과 일부 코드가 여기에 있습니다.

http://en.wikipedia.org/wiki/Eight_queens_puzzle

또한 코드는 여기에서 찾을 수 있습니다 : http://www.codeproject.com/KB/java/EightQueen.aspx

내가 말했듯이, 이것에 대해 나쁘게 생각하지 마십시오. 쉬운 것은 아닙니다.


0

이것은 실제로 주석에 대한 것이지만 거기에는 맞지 않습니다 ...

체스 판에는 8x8 정사각형이 있으며 더 이상은 아닙니다 (이러한 질문은 맞춤형 체스 판의 접근 방식으로 항상 귀찮습니다).

어쨌든, 당신이 x * y 체스 판과 n 개의 여왕을 가지고 있고 여왕 이 이것을 가져 가면 이 분야를 "취합니다"

여기에 이미지 설명을 입력하십시오

2 차원 배열을 만들고 여왕이 공격하는 모든 필드를 "플래그"할 수 있습니까? 그런 다음 보드 중간에서 다른 하나를 놓고 나머지 필드에 깃발을 붙입니다.

물론 이것은 매우 단순화 된 접근 방식입니다. 잘못된 방식으로 배치하면 최대 여왕 수를 모을 수 있기 때문입니다.

흠, 방금 이것도 발견했습니다 -8 명의 여왕 문제.


나는 처음에이 정확한 알고리즘을 제안했지만, 만약 당신이이 접근법을 취하고 당신이 마지막으로 여왕을 놓을 장소가 없다는 것이 당신이 정말로 불가능하다고 결정했다고 보장하지는 않는다고 생각합니다. 특정 배열 만 제거했습니다. 이것은 기본적으로 가장 가까운 이웃 휴리스틱의 응용 프로그램입니다.
면접관

@ 인터뷰 대상자-예, 알고 있습니다. 이것은 내가 머리 꼭대기에서 생각한 것입니다. 말했듯이, 그것은 흥미로운 문제이며 아마도 향상 될 수 있지만 오전 4시에 (나는 여기) 생각하기에 너무 게으르다. Btw, 인터뷰는 어땠어?
Rook

@ 인터뷰 대상자, 이것이 올바른 생각입니다. 빠진 부분은 마지막 여왕의 자리가 없다는 것을 발견하면 두 번째에서 마지막 여왕을 위해 다른 위치를 백업하고 시도한다는 것입니다. 마지막 여왕을 배치 할 수있는 여왕을위한 장소가 없다면, 다른 레벨을 백업하고 세 번째에서 마지막 여왕을 위해 다른 지점을 시도하십시오.
Caleb

나는 당신의 아바타가 체스 조각 인 것을 좋아합니다 :)
warren

0

기본적으로 역 추적 알고리즘은 다음과 같이 작동합니다.

  1. X by Y 배열을 만듭니다. 모든 사각형을 비워 두십시오.

  2. 퀸 카운트를 0으로 설정하십시오.

  3. 현재 위치를 (1,1)로 설정

  4. 현재 위치에 여왕을 배치 할 수 있는지 확인하십시오.

  5. 가능하면 Array (X, Y)를 queen로 설정하고 queen count를 증가시킵니다. 모든 여왕을 배치했다면 중지하십시오 . 해결책이 있습니다.

  6. 현재 위치가 (X, Y)가 아닌 경우 현재 위치를 증가시키고 4 단계로 이동하십시오.

  7. 마지막 위치 (위치를 증가시키는 순서대로 마지막에 오는 여왕)에서 여왕을 찾으십시오. 현재 위치를 해당 여왕의 위치로 설정하고 제거하고 여왕 수를 줄입니다.

  8. 퀸 카운트가 0이면 중지하십시오 . 해결책이 없습니다.

  9. 현재 위치를 증가시킵니다.

  10. 4 단계로 이동하십시오.


이 설명에서 알고리즘은 올바르게 역 추적되지 않습니다. 마지막 배치 가능한 여왕 만 제거합니다. 다른 위치에서 이전의 여왕을 시도하지 않을 위험이 있습니다.
카스퍼 반 덴 버그

@KaspervandenBerg 알고리즘이 올바르게 역 추적됩니다. 나는 당신의 비판에 직접 응답하지만 솔직히 이해할 수 없습니다. "마지막으로 놓을 수있는 여왕"이 무슨 뜻인지 모르겠습니다. 마지막에 놓인 여왕 만 제거하지만, 여왕이 제거 된 후에는 여왕이 마지막에 놓인 여왕이 될 수 있습니다. 필요한 순서대로 역행하여 여왕이 배치 된 순서와 반대로 여왕을 제거합니다.
David Schwartz

0

다른 답변에 추가 : 2 차원 배열을 만들면 코드가 복잡해집니다.

일반 체스 보드에는 크기가 8 인 벡터가 필요합니다. 또는 C와 같은 첫 번째 위치가 0 인 경우 8 + 1은 코드를 단순화하고 0-7이 아닌 1-8을 처리합니다.

x를 배열에서 위치로 생각하고 y를 위치의 내용으로 생각하면 예를 들어 board [1] = 8은 첫 번째 여왕이 [1,8]에 있음을 의미합니다.

이런 식으로 열 유효성 검사 만 확인하면됩니다.

교수진은 다트머스 베이직 (Dartmouth BASIC)에서 구현 된 알고리즘에 관한 아주 오래된 책 (60 년대)을 보았습니다.

내가 기억하는 한, 벡터 아이디어를 사용했으며 본질적으로 보드의 모든 위치를 두 번의 FOR 사이클로 강제했습니다. 위치 유효성을 검사하기 위해 세 번째 루프, 각 위치의 WHILE 사이클이 벡터로 돌아가서 같은 수를 확인하거나 접선 연산을 사용하여 대각선을 확인하는 수식을 사용했습니다.

슬프게도, 나는 그 책을 잃어 버렸습니다 ...

상기 알고리즘은 n- 퀸 문제에 대한 모든 해결책을 찾았다.


0

그러한 배열이 존재하는지 여부를 판별하기 위해 알고리즘을 작성해야하는 경우 기존 연구를보십시오 .
Wikipedia에서 8 개의 여왕 퍼즐 .

N> min (X, Y)이면 사소하게 false를 반환 할 수 있습니다.
해당 페이지를 읽은 후 N <= min (X, Y) 및 2, 3! = min (X, Y)이면 true를 반환하는 것을 알고 있습니다.

2, 3 == min (X, Y) 및 N <= min (X, Y)로 남습니다.

음, N <min (X, Y)이면 솔루션을 찾는 것이 쉽지 않습니다.
N == min (X, Y)이면 max (X, Y)> N 인 경우 솔루션 만 있습니다.

f(X, Y, N)
    if X < Y => f(Y, X, N)
    if Y > N => false
    => (Y < N) or (Y != 2 and Y != 3) or (X > N)

0

N> min (X, Y)이면 솔루션이 없습니다. 그렇지 않으면 N = X = Y = 2, N = X = Y = 3에 대한 해가 없음을 쉽게 나타낼 수 있습니다. 다른 모든 경우에는 해가있는 것 같습니다. N이 증가함에 따라 솔루션의 수가 증가하는 것으로 보입니다.

역 추적을 통해 철저한 검색을 통해 해결책을 찾을 수 있습니다. 첫 번째 열 (1 열)에 여왕을 두십시오. 첫 번째 열 (1 열의 여왕)이 도달 할 수없는 첫 번째 열에 여왕을 두십시오. 여왕을 두 번째 줄 등에 넣으십시오. 여왕을 줄 k에 넣을 수 없으면 여왕을 제거하고 다음 빈 점령 위치에서 여왕을 줄 k-1로 옮깁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.