페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
1000
ms
메모리 제한
2048
MB
헝가리 국고는 금고 중 하나의 잠금장치를 교체했습니다. 이 새로운 자물쇠는 맞춤형 키카드로만 열 수 있습니다. 키카드 검증은 특별한 프로토콜을 따릅니다.
자물쇠에는 부터 까지 번호가 매겨진 개의 내부 상태가 있습니다. 부터 까지의 각 에 대해, 상태 에는 비트 와 두 상태 , 이 연결되어 있습니다. 비트는 또는 인 이진 숫자입니다. 상태 과 은 같을 수도 있으며, 어떤 상태가 자기 자신과 연결될 수도 있습니다.
이와 비슷하게, 키카드에는 부터 까지 번호가 매겨진 개의 상태가 있으며, 부터 까지의 각 에 대해 상태 에는 비트 와 상태 , 이 연결되어 있습니다. 이후 자물쇠 상태와 키카드 상태를 모두 상태라고 부릅니다.
검증 과정에서 자물쇠는 키카드와 짝을 이룹니다. 둘 다 비트를 출력할 수 있고, 상대방의 출력에서 비트를 읽을 수도 있습니다. 과정이 시작될 때 자물쇠는 특정 초기 상태 으로 설정됩니다. 키카드 또한 그 키카드에 특정된 초기 상태 으로 설정됩니다. 둘은 다음 단계들을 최대 번 반복합니다.
검증 과정 중 어느 시점에서든 오류의 수가 에 도달하면 검증이 실패하고 과정이 종료됩니다. 그렇지 않고 개 이상의 오류를 기록하지 않은 채 번의 반복을 완료하면 검증이 성공하고 자물쇠가 열립니다.
새 자물쇠를 설치할 때 기술자들이 실수했습니다. 검증 과정에 사용되는 초기 상태 를 지정하는 것을 잊었습니다. 그 결과 자물쇠가 키카드와 짝을 이룰 때마다 임의의 (알 수 없는) 초기 상태로 설정됩니다.
여러분의 과제는 이 실수에도 불구하고 자물쇠를 열 수 있는 키카드를 만드는 것입니다.
다음 프로시저를 구현해야 합니다.
void construct_card(int N, int[] A, int[][] S)
이 프로시저는 키카드를 만들기 위해 다음 프로시저를 정확히 한 번 호출해야 합니다.
void define_states(int M, int[] B, int[][] T, int j0)
j0: 키카드의 초기 상태를 나타내는 수입니다.j0으로 설정됩니다.construct_card 프로시저에 의해 정확히 한 번 호출되어야 합니다.define_states의 매개변수에 대한 제약 조건은 아래의 제약 조건 절에 주어져 있습니다.
개의 상태를 갖는 자물쇠를 생각해 봅시다. 상태 에는 비트 과 상태 , 이 연결되어 있고, 상태 에는 비트 과 상태 , 이 연결되어 있습니다. 이 예제에서는 의 값이 라고 가정합니다.
construct_card 프로시저는 다음과 같이 호출됩니다.
construct_card(2, [0, 1], [[1, 0], [1, 0]])
먼저, 개의 상태를 갖고 , 이며 초기 상태가 인 키카드를 생각해 봅시다.
자물쇠의 알 수 없는 초기 상태가 인 경우, 검증 과정의 단계들은 다음 표와 같습니다. 자물쇠와 키카드의 상태는 각각 와 로 표시합니다.
| 단계 | 지금까지의 오류 수 | ||||||
|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 1 | 0 | ||
| 1 | 0 | 0 | 0 | 1 | 1 | ||
| 2 | 0 | 0 | 0 | 1 | 2 |
마지막 두 열은 다음 단계에서의 자물쇠와 키카드의 상태를 나타낸다는 점에 유의하십시오.
단계 에서는 이므로 오류가 없음을 알 수 있습니다. 단계 이후 단계 과 단계 에서 오류가 발생하므로 검증이 실패하고 과정이 종료됩니다. 따라서 이 키카드는 자물쇠를 열 수 없습니다.
개의 상태를 갖고 , 이며 초기 상태가 인 키카드를 생각해 봅시다.
자물쇠의 초기 상태가 이면 검증은 다음과 같이 진행됩니다.
| 단계 | 지금까지의 오류 수 | ||||||
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | ||
| 1 | 1 | 1 | 1 | 1 | 0 | ||
| 2 | 0 | 0 | 0 | 0 | 0 |
이 시점에서 검증 과정이 오류 없이 성공할 것임을 추론할 수 있습니다.
자물쇠의 초기 상태가 이면 검증은 다음과 같이 진행됩니다.
| 단계 | 지금까지의 오류 수 | ||||||
|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 0 | 0 | 1 | ||
| 1 | 1 | 1 | 1 | 1 | 1 | ||
| 2 | 0 | 0 | 0 | 0 | 1 |
이 시점에서 검증 과정이 추가 오류 없이 성공할 것임을 추론할 수 있습니다.
따라서 이 키카드는 자물쇠의 초기 상태와 관계없이 자물쇠를 열 수 있습니다. 프로시저는 다음과 같이 define_states를 호출할 수 있습니다.
define_states(2, [0, 1], [[1, 1], [0, 0]], 0)
define_states가 완료된 후 construct_card 프로시저는 반환해야 합니다.
샘플 그레이더는 다음 형식으로 입력을 읽습니다.
샘플 그레이더가 프로토콜 위반을 감지하면 샘플 그레이더의 출력은 Protocol Violation: <MSG>이며, 여기서 <MSG>는 다음 오류 메시지 중 하나입니다.
missing call: construct_card 프로시저가 define_states를 호출하지 않고 반환했습니다.too many calls: construct_card 프로시저가 define_states를 두 번 이상 호출했습니다.invalid number: 이 이상 이하의 정수가 아닙니다.invalid array: 배열 의 길이 또는 배열 의 길이가 과 다르거나, 의 길이가 가 아닌 인덱스 ()가 존재합니다.invalid bit: 가 또는 이 아닌 인덱스 ()가 존재합니다.invalid state: 과 중 적어도 하나가 이상 이하의 정수가 아닌 인덱스 ()가 존재합니다.invalid initial state: j0이 이상 이하의 정수가 아닙니다.그렇지 않으면 샘플 그레이더는 두 가지 출력을 생성합니다.
먼저, 샘플 그레이더는 만들어진 키카드를 다음 형식으로 출력합니다.
둘째, 샘플 그레이더는 작업 디렉터리에 lockpicking.bin 파일을 작성합니다. 이 파일은 다음 절에서 설명하는 테스팅 도구의 입력으로 사용됩니다.
이 과제의 첨부 패키지에는 display.py라는 파일이 들어 있습니다. 이 Python 스크립트를 실행하면 자물쇠와 키카드 사이의 검증 과정을 시뮬레이션합니다. 이를 위해 바이너리 파일 lockpicking.bin이 작업 디렉터리에 있어야 합니다.
첫 번째 시뮬레이션에서 자물쇠의 초기 상태는 입니다. 시뮬레이션이 완료되면 간단한 그래픽 인터페이스가 나타납니다. 주요 기능은 다음과 같습니다.
Init Lock 버튼을 사용하십시오.Reload 버튼은 설정 파일 lockpicking.bin을 다시 불러옵니다. lockpicking.bin의 내용이 변경된 경우 유용합니다.마지막 두 작업은 자동으로 시뮬레이션을 다시 실행하고 GUI를 갱신합니다.
스크립트를 실행하려면 다음 명령을 실행하십시오.
python3 display.py
2 2
0 1 0
1 1 0
International Olympiad in Informatics (IOI) 2023, official task package; Korean translation by Reporch.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.