Информатикадан халықаралық олимпиадаға Жапония атынан өкіл ретінде таңдалған A және B ақпаратты өңдеу дағдыларын жетілдіру үшін Информатикадан халықаралық олимпиаданың Жапония комитетінің директоры K-мен «Хабаршы ойынын» ойнауды ұйғарды. Бұл ойынның ережелері төменде түсіндіріледі.
A мен B суретте көрсетілгендей бөлмелерде оқшауланған. A, B және директор K-ның бөлмелерінде ішкі телефондар болғанымен, қоңырауды тек директор K шала алады. Байланыстың басқа құралдары үзілген, ал A мен B нұсқау берілмейінше өз бөлмелерінен шыға алмайды.
A-ның бөлмесі | Ұзын дәліз | Директор K-ның бөлмесі | Ұзын дәліз | B-ның бөлмесі
Ойынның басында директор K телефон арқылы A-ға оң бүтін $X$ санын айтады. Ойынның мақсаты — A мен B арасында тікелей байланыс болмаса да, A-ның B-ға $X$ мәнін дұрыс жеткізуі.
Директор K-ның бөлмесінде $4 \times 4$ тор бар. $(i, j)$ арқылы $i$-ші жол мен $j$-ші бағандағы ұяшықты белгілейік ($1 \le i \le 4, 1 \le j \le 4$). $(1, 1)$ ұяшығы — сол жақ жоғарғы бұрыш, $(1, 4)$ — оң жақ жоғарғы бұрыш, $(4, 1)$ — сол жақ төменгі бұрыш, ал $(4, 4)$ — оң жақ төменгі бұрыш. Ойынның басында ұяшықтардың біріне тас (фишка) қойылады. Осыдан кейін директор K тас қойылған ұяшықты өзгертпейді.
Осы сәттен бастап директор K телефон арқылы бөлмеге A-ны немесе B-ны қайта-қайта шақырады. A немесе B директор K-ның бөлмесіне келген сайын, олар тасты көршілес ұяшыққа (жоғары, төмен, солға немесе оңға) жылжытуы керек. Тасты жылжытқаннан кейін A немесе B өз бөлмесіне оралады. Егер B директор K-ның бөлмесіне келген кезде $X$ мәнін білсе, B тасты жылжытудың орнына оны директор K-ға жауап ретінде айта алады. Егер $X$-тің дұрыс мәні айтылса, бұл дұрыс жауап болып саналады; әйтпесе, бұл қате жауап болады.
Директор K-ның A-ны немесе B-ны бөлмеге шақыру уақыты тұрақсыз, ал A мен B директор K-ның екеуін бөлмеге қандай ретпен шақырып жатқанын білмейді. Дегенмен, директор K екеуін шақыру ретін ойынның басында шешіп қояды және директор K не A-ны, не B-ны қатарынан 100 реттен артық шақырмайтынына кепілдік беріледі. Егер директор K A мен B-ны барлығы 10,000 рет шақырып, A немесе B өз бөлмесіне оралғаннан кейін де B $X$ мәнін айтпаған болса, ойын қате жауаппен аяқталады.
Тапсырма
A және B үшін стратегияларды іске асырып, жоғарыда сипатталған «Хабаршы ойынында» дұрыс жауап бере алатын программа құрыңыз.
Іске асыру детальдары
Сіз бір программалау тілінде екі файл жіберуіңіз керек.
Бірінші файл playerA.c немесе playerA.cpp деп аталады. Бұл файл A-ның стратегиясын іске асырады және онда келесі процедуралар іске асырылуы тиіс:
void InitA(int T, int X)Бұл процедура ең басында дәл бір рет шақырылады.Tаргументі — ішкі есептің нөмірі.Xаргументі — A-ның B-ға жеткізуі тиіс оң бүтін сан.int GameA(int I, int J)Бұл процедура A директор K-ның бөлмесіне келгенде шақырылады.IжәнеJаргументтері — A директор K-ның бөлмесіне келген кезде тас орналасқан $(I, J)$ ұяшығын білдіретін, $1 \le I \le 4$ және $1 \le J \le 4$ шарттарын қанағаттандыратын бүтін сандар. Бұл процедура $-1, -2, -3, -4$ бүтін сандарының бірін қайтаруы керек. Егер басқа мән қайтарылса, ол Wrong Answer [1] ретінде бағаланады және программаның орындалуы тоқтатылады. Бұлар A-ның келесі әрекеттерін білдіреді:- $-1$: Тасты жоғарғы $(I - 1, J)$ ұяшығына жылжыту.
- $-2$: Тасты төменгі $(I + 1, J)$ ұяшығына жылжыту.
- $-3$: Тасты сол жақтағы $(I, J - 1)$ ұяшығына жылжыту.
- $-4$: Тасты оң жақтағы $(I, J + 1)$ ұяшығына жылжыту. Егер тасты тақтадан тыс шығаратын жүріс көрсетілсе, ол Wrong Answer [2] ретінде бағаланады және программаның орындалуы тоқтатылады.
Екінші файл playerB.c немесе playerB.cpp деп аталады. Бұл файл B-ның стратегиясын іске асырады және онда келесі процедуралар іске асырылуы тиіс:
void InitB(int T)Бұл процедура ең басында дәл бір рет шақырылады.Tаргументі — ішкі есептің нөмірі.int GameB(int I, int J)Бұл процедура B директор K-ның бөлмесіне келгенде шақырылады.IжәнеJаргументтері — B директор K-ның бөлмесіне келген кезде тас орналасқан $(I, J)$ ұяшығын білдіретін, $1 \le I \le 4$ және $1 \le J \le 4$ шарттарын қанағаттандыратын бүтін сандар. Бұл процедура $-1, -2, -3, -4$ бүтін сандарының бірін немесе оң бүтін $Y$ санын қайтаруы керек. Егер басқа мән қайтарылса, ол Wrong Answer [3] ретінде бағаланады және программаның орындалуы тоқтатылады. Бұлар B-ның келесі әрекеттерін білдіреді:- $-1$: Тасты жоғарғы $(I - 1, J)$ ұяшығына жылжыту.
- $-2$: Тасты төменгі $(I + 1, J)$ ұяшығына жылжыту.
- $-3$: Тасты сол жақтағы $(I, J - 1)$ ұяшығына жылжыту.
- $-4$: Тасты оң жақтағы $(I, J + 1)$ ұяшығына жылжыту. Егер тасты тақтадан тыс шығаратын жүріс көрсетілсе, ол Wrong Answer [4] ретінде бағаланады және программаның орындалуы тоқтатылады.
- Оң бүтін $Y$ саны: Директор K-ға $X$-тің мәні $Y$ екенін жауап ретінде айту. Егер $X = Y$ болса, бұл дұрыс жауап; әйтпесе ол Wrong Answer [5] ретінде бағаланады және программаның орындалуы тоқтатылады.
GameA және GameB процедураларының ешқайсысы қатарынан 100 реттен артық шақырылмайды. Сондай-ақ, егер GameA мен GameB барлығы 10,000 рет шақырылғанға дейін GameB оң бүтін сан қайтармаса, ол Wrong Answer [6] ретінде бағаланады және программаның орындалуы тоқтатылады.
Ішкі пайдалану үшін басқа процедураларды іске асыруға немесе глобалды айнымалыларды жариялауға еріктісіз. Дегенмен, жіберілген екі программа грейдер программасымен бірге бір орындалатын файлға біріктірілетіндіктен, басқа файлдармен қақтығыспау үшін әр файлдағы барлық глобалды айнымалылар мен ішкі процедураларды static ретінде жариялауыңыз керек. Бағалау кезінде бұл программа екі бөлек процесс ретінде (біреуі A үшін, біреуі B үшін) орындалады, сондықтан глобалды айнымалыларды A жағы мен B жағы арасында ортақ пайдалану мүмкін емес. Сіздің жіберген шешіміңіз стандартты енгізу/шығарумен немесе кез келген басқа файлдармен ешқандай түрде әрекеттеспеуі тиіс.
Кіріс деректер
Үлгі грейдер стандартты енгізуден келесі кіріс деректерді оқиды:
- Бірінші жолда бос орындармен бөлінген $T, X, I_0, J_0$ бүтін сандары берілген, олар ішкі есептің нөмірі $T$-ны, A-ның B-ға жеткізуі тиіс бүтін $X$ санын және ойын басындағы тастың бастапқы орны $(I_0, J_0)$-ді білдіреді.
- Екінші жолда екі түрлі 'A' және 'B' таңбаларынан тұратын ұзындығы дәл 10,000 болатын жол берілген. Егер $k$-шы таңба ($1 \le k \le 10,000$) 'A' немесе 'B' болса, бұл
InitAменInitBшақырылғаннан кейін шақырылатын $k$-шы процедура сәйкесіншеGameAнемесеGameBекенін білдіреді.
Шығыс деректер
Егер программа қалыпты аяқталса, үлгі грейдер стандартты шығаруға бір жолда келесі ақпаратты шығарады:
- Егер дұрыс болса, "Accepted" шығарылады (тырнақшалар іс жүзінде шығарылмайды; төменде де солай).
- Егер қате болса, "Іске асыру детальдары" бөлімінде жазылған сандарға негізделіп, қате жауаптың түрі "Wrong Answer [1]" ретінде шығарылады. Сонымен қатар, Wrong Answer [5] үшін $X$-тің дұрыс мәні және
GameBпроцедурасы қайтарған оң бүтін $Y$ саныWrong Answer [5] : X = 2, Y = 3ретінде шығарылады.
Шектеулер
Барлық кіріс деректер келесі шарттарды қанағаттандырады:
- $1 \le X \le 1,000,000,000$.
Ішкі есептер
Ішкі есеп 1 [20 ұпай]
- $T = 1$ шарты орындалады.
- Алдымен директор K-ның бөлмесіне A шақырылады, содан кейін A мен B директор K-ның бөлмесіне кезекпен шақырылады. Яғни,
InitAжәнеInitBшақырылғаннан кейін процедураларGameA,GameB,GameA,GameB, ... ретімен шақырылады.
Ішкі есеп 2 [20 ұпай]
- $T = 2$ шарты орындалады.
- Ойын басында тастың орны $(I_0, J_0) = (1, 1)$ болады. Яғни,
InitAжәнеInitBшақырылғаннан кейін алдымен аргумент ретінде $I = 1, J = 1$ мәндеріменGameAнемесеGameBпроцедурасы шақырылады.
Ішкі есеп 3 [60 ұпай]
- $T = 3$ шарты орындалады.
Ескертпе
Үлгі грейдер оқитын кіріс деректердің мысалы және оған сәйкес процедура шақыруларының мысалы төменде көрсетілген.
| Кіріс деректер |
|---|
| 2 6 1 1 |
| ABBAABAAABBBBBABBAABBBABBBBAAAAABABAABAABBBBABAAAA (қысқартылған) |
| A жағы | B жағы | ||
|---|---|---|---|
| Шақыру | Қайтару | Шақыру | Қайтару |
| InitA(2, 6) | Жоқ | ||
| InitB(2) | Жоқ | ||
| GameA(1, 1) | -2 | ||
| GameB(2, 1) | -4 | ||
| GameB(2, 2) | -2 | ||
| GameA(3, 2) | -3 | ||
| GameA(3, 1) | -1 | ||
| GameB(2, 1) | 6 |
Бұл мысал міндетті түрде мағыналы өзара әрекеттесуді сипаттамайтынын ескеріңіз.