이 고전적인 퍼즐 북 게임 NP- 완료입니까?


10

단어 목록이 주어진다는 점을 제외하고 크로스 워드 퍼즐과 매우 유사한 고전적인 퍼즐 북 게임이 있습니다. 단일 사각형으로 구성된 정사각형 보드가 주어지며 일부 정사각형은 십자말처럼 검은 색으로 표시됩니다. 일부 사각형에는 이미 미리 작성된 문자가 있습니다. 목표는 퍼즐에서 한 번만 목록에서 각 단어를 작성하는 것입니다. 여기서 각 단어는 수평으로 (왼쪽에서 오른쪽으로) 또는 수직으로 (위에서) 검은 색이 아닌 연속 사각형으로 쓰여지며 단어를 쓸 때 , 단어의 끝에있는 두 개의 사각형은 검은 색이거나 보드에서 떨어져 있어야합니다. 또한 일부 사각형으로 미리 작성된 글자의 경우이 사각형과 겹치는 글자는 미리 작성된 글자를 존중해야합니다.N×N

이제 단어의 고정 크기 알파벳을 가정하면 보드의 측면 길이가 고정되지 않았습니까?

답변:


6

오래된 게시물에 답장을 보내서 죄송합니다.

나는 그것에 대해 생각하고 있으며 고정 알파벳의 문제는 NP 완료라고 생각합니다.

이 단어 문제에 대해 긍정적 인 1-in-3 SAT를 줄 이겠습니다.

어제 나는 문제를 해결하기위한 아이디어를 얻는 데 어려움을 겪고있었습니다. 질문을 다시 볼 때까지 각 변수를 다르게 만드는 데 어려움이 있었고 심은 기호가있는 사각형을 사용할 수 있음을 깨달았습니다. 이것은 감소를 많이 단순화했습니다. 내 다른 아이디어는 각 변수마다 길이가 다른 단어를 사용하는 것이 었습니다.

감소

이제 우리가 사용할 가제트에 대해 설명하겠습니다.

가변 가제트

각 변수에 다른 숫자 인덱스를 레이블링하고 각 변수마다 다른 숫자를 갖습니다. 가장 큰 인덱스를 선택하고 이진수로 숫자를 나타내면이 이진 체인 호출합니다 .n

그런 다음 각 변수에 대해 서로 다른 두 개의 수직 단어를 만듭니다. 모든 단어의 길이는(단어 목록에서 중복 단어를 허용하는 경우에만), 여기서이진 체인 의 길이입니다 .3+|n||n|n

예를 들어, 가장 큰 색인을 숫자 . 이 숫자를 이진수로 변환 할 때 이진수로 체인 을 얻습니다 .이 체인의 길이는 3입니다. 따라서이 예에서 각 변수 단어의 길이는 입니다.41006

이제 각 변수에 대해 서로 다른 두 단어를 만듭니다. 한마디 심볼 것 , 처음에 다음 기호 그래서 동일한 길이를 가지고 체인 제로와 변수 인덱스 우리는 패드를 나타내는 아래의 다음 이진 체인을 그 체인 마지막 심볼 끝에. 물론 기호를 변경할 수 있습니다.32n3

다른 단어는 거의 동일하지만 기호 대신 기호 를 갖습니다 .43

예를 들어, 가장 큰 색인을 숫자 . 인덱스 의 변수에 대해 다음 두 단어가 있습니다 .41

320013420014

보시다시피 우리 는 길이가 이되도록 숫자 의 이진 반복을 0으로 채웠 습니다.1|n|

우리는이 단어들을 여러 번 복사해야하며, SAT 인스턴스에서 변수가 발생할 때마다 각 단어의 사본이 필요합니다. 단어 목록에 중복이 만들어집니다. 변수를 고유하게 식별하는 이진 체인에 다른 이진 체인을 추가하여 중복을 제거 할 수 있습니다. 이 새로운 체인은 변수의 각 발생을 고유하게 식별합니다.

이를 위해 변수의 각 발생에 다른 이진 체인을 할당하고 변수의 이진 표현 끝에 해당 체인을 배치합니다.

이 새로운 이진 체인을 만들려면 먼저 각 변수마다 다른 인덱스를 만들어야합니다. 각 인덱스 에서 가장 큰 숫자를 호출합니다. 여기서 는 각 변수의 식별자입니다. 그런 다음 숫자 를 이진 체인으로 변환 한 다음 체인의 길이를 이 숫자를. 그런 다음 각 인덱스에 대해 변수의 각 발생에 대해 서로 다른 이진수를 만듭니다. 이진 체인의 길이가 가 될 때까지 0으로 숫자를 채변수의 각 발생에 속하는 모든 단어의 길이가 동일합니다.niini|ni||ni|

변수 단어 내부의 중복을 제거합니다.

예를 들어, 변수 가 SAT 인스턴스에 세 번 나타나는 것으로 가정하십시오 . 우리는 다음과 같은 단어를 만듭니다.x2

32010013 42010014 , 및32010103 4201010432010113 42010114

조항 가제트

각 조항 가젯에 대해 3 개의 새로운 수평 단어를 작성하고 각 조항 단어의 길이는 제곱입니다 (단어 목록에서 중복 단어를 허용하는 경우에만). 각 절에 대해 생성 할 단어는 다음과 같습니다.6

535354 , 및535453545353

우리는 절을 만족시키는 각각의 가능한 방법에 대해 다른 절 단어를 가지고 있으며, 기호 는 리터럴 세트를 true로 나타내고 기호 은 리터럴 세트를 false로 나타냅니다. 숫자 는 절 단어임을 나타내는 데 사용됩니다.435

단어 목록에 단어가 반복적으로 표시되므로 변수 단어를 고유하게 식별하는 데 사용한 절차를 사용하여 반복을 제거 할 수 있습니다. 즉, 각 절에 대해 서로 다른 이진 체인을 만들고 각 절에 해당하는 절 단어에 각 체인을 추가합니다. 이를 위해 절에 대한 새 색인을 작성하고 가장 많은 색인을 선택하기 위해이 번호를 이라고합니다 . 우리는 표현 진 체인 등을 우리가 같이 바이너리 체인의 길이를 호출. 이제 숫자 1부터 시작하여 각 절에 대해 서로 다른 이진 숫자를 만들고 길이를 이진 체인을 만들기 위해 숫자를 0으로 채 웁니다.mm|m||m|. 각 이진 체인을 절에 속하는 절 단어에 추가합니다.

이제 칠판에 조항 가제트의 그림을 보자.

예제 절

이 예는 절을 나타내고 축소되는 3 in 1 인스턴스는(x2x3x4)(x1x2x3)(x2x3x4)

보시다시피, 정사각형이 있습니다. 세로 열에는 절 안에 어떤 리터럴이 있는지 나타내는 기호가 기록되어 있습니다. 열의 끝과 시작은 빈 사각형입니다. 이를 통해 플레이어는 변수 값을 선택할 수 있습니다. 가로 행에 표시된 기호는 플레이어가 해당 행에 절 단어를 넣도록합니다. 모든 절 단어에는 단일 기호 만 있기 때문에 절 가젯 안에있는 리터럴 중 하나만 "true"로 설정할 수 있습니다.4

단어 목록 내에서 중복을 허용하지 않으면 이미지를 수정해야합니다.

이미지의 절은 이되고 리터럴 열은 왼쪽에서 오른쪽으로 나타납니다.5b5b5b10

b201010b , 및b201110bb21001b

기호 빈 사각형을 의미하는 경우b

예를보십시오 :

절, 반복 없음

가변 일관성 가젯

이 변수는 플레이어가 변수의 모든 리터럴 열에 대해 동일한 값만 할당 할 수 있도록하는 가제트입니다.

각 변수마다 새로운 가제트가 생깁니다

각 가제트마다 두 개의 새 단어를 만듭니다.

단어의 길이는 변수의 발생 횟수에 따라 다릅니다. 단어의 길이는 여기서 는 변수의 발생 횟수입니다. 따라서 sat 인스턴스에서 변수 가 두 번 나타나면 단어의 길이는 4입니다. 두 단어 중 하나는 체인의 반복에 의해 형성되는 k는 변수의 발생 횟수이고, 회. 다른 단어들은 체인의 반복에 의해 형성되는 K가 감소되는 SAT 인스턴스 변수의 발생 횟수이고, 회.2kkx263 k64 k

예를 들어 변수 에 두 개의 발생이있는 경우 해당 변수 할당 가젯에 속하는 단어는 다음과 같습니다.x2

63636464

반복되는 단어를 피하려면 각 일관성 가젯이 다른 변수에 속합니다. 따라서이 가젯을 위해 만든 두 단어에 각 변수를 식별하는 이진 체인을 추가 할 수 있습니다.

이제이 가제트의 예제 사진을 보자 :

가변 일관성 가젯

이 가제트는 변수 이며 축소되는 3 in 1 인스턴스는 입니다.x2(x1x2x3)(x2x3x4)

보시다시피, 두 개의 가로 행이 있습니다. 행 안에 쓰여진 기호는 해당 기호가 포함 된 단어 만 배치 할 수 있도록합니다.이 단어는이 가젯에 대해 만든 단어입니다. 행 중 하나에서 열에 배치 된 기호로 인해 변수 단어 만 배치 할 수 있는지 확인하는 두 개의 열이 있음을 알 수 있습니다. 변수 일관성 행에만 배치 할 수있는 유일한 단어에는 기호 만 있거나 기호 만 있기 때문에 플레이어는 해당 기호가있는 모든 가변 단어를 가제트 내에 배치해야합니다. 이는 조항 가젯 내에 배치 할 수있는 유일한 변수 단어에는 기호 만 있거나 기호 만 있음을 의미합니다.3434. 이 gagdet의 나머지 단어를 다른 줄에 넣을 수 있습니다

단어 목록에서 중복을 허용하지 않으면 예제 그림 내의 단어는 다음과 같습니다.

행의 경우 :

6b6b0106b6b010

열의 경우 :

b201001bb201010b

기호 빈 사각형을 의미하는 경우b

예를보십시오 :

일관성 가젯, 반복 없음

조항 덤프 가젯

사용되지 않는 절 단어를 배치하기 위해 작성된 가제트입니다. 그렇게하기 위해, 우리는 보드의 빈 부분에 각 절 단어에 대해 두 개의 행만 배치하면됩니다. 이 행은 다른 행이나 열에 연결되어 있지 않습니다.

이것으로 축소를 마칩니다. 축소를 위해 6 개의 기호 만 필요하다고 주장했습니다.

이전의 설명이 혼란 스러우면 다음은이 단어 문제로 축소 된 3 SAT에서 1의 양수의 예를 보여줍니다.

보드 예

반복되는 단어가 허용되지 않는 경우 :

예제 보드, 반복 없음

축소 된 인스턴스는 다음과 같습니다.

(x1x2x3)(x2x3x4)


이것을 게시 해 주셔서 감사합니다! 불행히도 Stack Exchange의 특징은 다른 사람이 긴 답변을 읽을 가능성이 거의 없기 때문에 여기서 수행 한 많은 작업에서 많은 투표를 할 가능성이 거의 없다는 것입니다. 나는 이것을 읽으려고 노력할 것이다. 그러나 만일 내가 정직하다면, 나는 그것을 돌아 보지 않을 좋은 기회가있다.
David Richerby

2
@DavidRicherby jaja 네. 나는이 질문에서 잠시 생각하고있었습니다. 나는이 답변을 게시 할 때 모두가 가서 찬성 할 것이라고 생각했습니다. 일어나지 않았다. 뭐, 신경 쓰지 마. 축소에 대해 궁금한 점이 있으면 나에게 물어볼 수 있습니다
rotia

4

나는 지시 해밀턴 경로에서 다음과 같은 감소가 효과가 있다고 생각합니다.

그래프 와 두 개의 정점 주어지면 다음 퍼즐을 출력합니다.에요 , t VG=(V,E)s,tV

알파벳은 이며 는 없는 기호 입니다.VV{}V

단어는 모든 대해 이고 모든 edge 대해 입니다 .v V v u ( u , v ) EvvvVvu(u,v)E

보드는 두 부분으로 구성됩니다. 첫 번째는길이 3의 가로 "계단"은 다음과 같이 서로 겹쳐 쌓입니다.|V|

계단

두 번째 부분은 길이가 2 인 분리 된 공간으로 구성됩니다.|E|(|V|1)

또한 계단의 첫 번째 (아래) 단계에서 단어 를 설정하고 단어 목록에서 제거하고 마지막 단계에서 넣습니다 .t * tsstt

이제 계단을 채우려면 단계 내에 꼭짓점 단어 만 넣을 수 있고 두 꼭짓점을 연결하려면 가장자리 단어를 그 사이에 넣어야합니다. 이는 그래프의 기존 가장자리에 해당합니다. 사용하지 않는 모서리는 보드의 두 번째 부분에 넣을 수 있습니다. 두 번째 방향은 사소합니다.

나는 이것이 효과가 있다고 생각한다 (내가 스케치 한 정확성 증거는 기껏해야 수동으로 손을 흔들지 만 여전히).


1
좋은. 계단의 가장 바깥 쪽 공간에 하나 와 를 미리 쓰면 충분합니다 (단어 목록에서 제거 할 필요가 없음). 그리고 완전성을 위해 충분히 크게 선택 하고 검은 사각형으로 채워서 그리드를 쉽게 으로 만들 수 있다고 언급 할 가치가 있습니다 . t N × N NstN×NN
FrankW

이것은 훌륭하고 작동하는 것처럼 보이지만 알파벳 크기는 원래의 게시물이 요청한 것처럼 고정되어 있지 않습니다. 고정 크기의 알파벳을 사용하면서도 축소가 가능합니까?
user2566092

@ user2566092-좋은 지적. 생각하려고합니다. 아마도 가장자리 표현으로 만 채울 수있는 가제트는 단어 대신 사용될 수 있으며 모든 것은 이진으로 인코딩 될 수 있습니다. uv
Shaull
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.