QOJ.ac

QOJ

시간 제한: 1.0 s 메모리 제한: 1024 MB 총점: 100 난이도: [표시] 인터랙티브 해킹 가능 ✓

#14801. Wow, è ieri altre sei volte

통계

Questo è un problema interattivo.

Dopo il grande successo ottenuto dal 2018 al 2024, la Nanjing University of Aeronautics and Astronautics (NUAA) ospiterà per l'ottava volta consecutiva la fase regionale di Nanchino dell'International Collegiate Programming Contest (ICPC).

Il team Power of Two e il team Three Hold Two hanno vinto il titolo di campione per la Tsinghua University nel 2018 e nel 2019. Nel 2020, 2021 e 2022, il team Inverted Cross della Peking University ha conquistato tre titoli consecutivi, mentre nel 2023 un altro team della Peking University, Reborn as a Vegetable Dog, ha vinto il titolo. Nel 2024, il team Afterlife della Zhejiang University si è classificato al primo posto.

Quest'anno partecipano alla gara circa $335$ squadre. Verranno assegnate al massimo $33$ medaglie d'oro, $66$ medaglie d'argento e $99$ medaglie di bronzo (si noti che questi numeri sono solo indicativi). Non vediamo l'ora di assistere alle straordinarie prestazioni dei partecipanti! Desideriamo inoltre esprimere la nostra gratitudine per il duro lavoro svolto da tutto lo staff e dai volontari per questa gara. Grazie a tutti per il vostro grande contributo a questa competizione!

problem_14801_14f4e0d409041ff1a7f605c15d7d9bfb.png

Foto scattata durante il 2023 ICPC Asia Nanjing Regional Contest

Nella gara del 2018, il problema K, Kangaroo Puzzle, richiedeva ai concorrenti di costruire una sequenza di operazioni per il gioco:

Il puzzle è una griglia con $n$ righe e $m$ colonne ($1 \le n, m \le 20$), e ci sono alcuni (almeno $2$) canguri nella griglia. L'obiettivo del giocatore è controllarli per farli riunire nella stessa cella. In alcune celle sono presenti dei muri e i canguri non possono entrare nelle celle con i muri. Le altre celle sono vuote. I canguri possono spostarsi da una cella vuota a una cella vuota adiacente in quattro direzioni: su, giù, sinistra e destra.

All'inizio c'è esattamente un canguro in ogni cella vuota, e il giocatore può controllare i canguri premendo i pulsanti U, D, L, R sulla tastiera. I canguri si muoveranno simultaneamente in base al pulsante premuto.

Il concorrente deve costruire una sequenza di operazioni di al più $5 \times 10^4$ passi composta esclusivamente da U, D, L, R per raggiungere l'obiettivo.

Nella gara del 2020, il problema A, Ah, It’s Yesterday Once More, richiedeva ai concorrenti di costruire una mappa di input per violare (hackerare) il seguente codice relativo al problema descritto in precedenza:

#include <bits/stdc++.h>
using namespace std;
string s = "UDLR";
int main()
{
    srand(time(NULL));
    for (int i = 1; i <= 50000; i++) putchar(s[rand() % 4]);
    return 0;
}

Inoltre, nella gara del 2021 (Problema A, Oops, It’s Yesterday Twice More), nella gara del 2022 (Problema A, Stop, Yesterday Please No More), nella gara del 2023 (Problema A, Cool, It’s Yesterday Four Times More) e nella gara del 2024 (Problema A, Hey, Have You Seen My Kangaroo?), ogni anno abbiamo avuto un problema legato ai canguri! Vorremmo presentarvi tutti questi problemi, ma se lo facessimo ogni anno, nella gara del 3025 potremmo ritrovarci con un testo di 500 pagine per un singolo problema. Pertanto, questa volta li omettiamo. Del resto, potreste averli già visti nella gara di prova.

Ora, nella gara del 2025, come tutti si aspettavano, il problema dei canguri è tornato! Non sappiamo perché gli autori dei problemi siano così ossessionati dai canguri, ma il problema è il seguente:

Vi viene data una griglia con $n$ righe e $m$ colonne. C'è una buca nella cella situata sulla $i_h$-esima riga e sulla $j_h$-esima colonna. Tutte le altre celle sono vuote e in ciascuna di esse si trova un canguro.

Allo stesso modo, i canguri vengono controllati premendo il pulsante U, D, L, R sulla tastiera. Tutti i canguri si muoveranno simultaneamente in base al pulsante premuto. Nello specifico, per qualsiasi canguro situato nella cella sulla $i$-esima riga e $j$-esima colonna, indicata con $(i, j)$:

  1. Pulsante U: si sposterà in $(i - 1, j)$.
  2. Pulsante D: si sposterà in $(i + 1, j)$.
  3. Pulsante L: si sposterà in $(i, j - 1)$.
  4. Pulsante R: si sposterà in $(i, j + 1)$.

Se un canguro finisce nella buca (cioè $i = i_h$ e $j = j_h$) oppure esce dalla griglia, viene rimosso dalla griglia.

Il problema è che i valori esatti di $i_h$ e $j_h$ non sono noti. Il vostro compito è trovare la posizione della buca con al più $(n + m + 10)$ interrogazioni (query). Per ciascuna interrogazione, potete premere un pulsante (U, D, L oppure R). L'interattore stamperà come risposta un intero $t$, che indica il numero di canguri rimasti dopo aver premuto il pulsante.

Si noti che l'interattore non è adattivo, il che significa che la risposta per ciascun caso di test è predeterminata.

Input

Ci sono più casi di test. La prima riga dell'input contiene un intero $T$ ($1 \le T \le 100$) che indica il numero di casi di test. Per ciascun caso di test:

La prima riga contiene due interi $n$ e $m$ ($3 \le n, m \le 30$) che indicano il numero di righe e di colonne della griglia.

Protocollo di interazione

Per effettuare un'interrogazione, stampate una riga. Stampate prima ? seguito da uno spazio, poi una lettera maiuscola dell'alfabeto inglese (U, D, L oppure R). Dopo aver effettuato il flush dell'output, il vostro programma dovrà leggere un singolo intero $t$ che indica la risposta alla vostra interrogazione. Ricordate che potete effettuare al più $(n + m + 10)$ interrogazioni per ciascun caso di test.

Se volete indovinare la posizione della buca, stampate una riga. Stampate prima ! seguito da uno spazio, poi due interi $i_h$ e $j_h$ ($1 \le i_h \le n$, $1 \le j_h \le m$) separati da uno spazio che indicano la posizione. Dopo aver effettuato il flush dell'output, il vostro programma dovrà continuare elaborando il caso di test successivo, oppure terminare immediatamente se non ci sono altri casi di test. Si noti che il tentativo finale non conta come interrogazione.

Per effettuare il flush dell'output, potete usare:

  • fflush(stdout) (se usate printf) oppure cout.flush() (se usate cout) in C e C++.
  • System.out.flush() in Java e Kotlin.
  • sys.stdout.flush() in Python.

Esempi

2
3 4

7

3

4 3

8

5
? L

? D

! 2 3

? U

? R

! 1 1

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.