1. 程式人生 > >LOJ #559. 「LibreOJ Round #9」ZQC 的迷宮

LOJ #559. 「LibreOJ Round #9」ZQC 的迷宮

AS left str int 交互 stdout block tro flush

一道ZZ結論題,主要是來寫一寫交互題的。

我們要先知道一句話:

扶著墻是肯定可以走出簡單迷宮的。

然後我們冷靜分析問題。若這個迷宮是\(n\times m\)的,那麽最多有\(2mn+n+m\)個墻壁。

由於題目中提到方格之間都聯通且形成一棵,那麽我們刪去\(nm-1\)條邊。

由於邊界其中至多一半會經過一次,其余則不會經過內部邊可能經過兩次,因此摸著墻壁前進的步數上限為 \(2(nm+n+m+1)-3(n+m)=2nm-n-m-2\)。我們在觀察一下數據範圍,發現:

\(l>2nm\ge 2nm-n-m-2\)。因此我們摸著墻壁走是肯定可以在規定步數內走到終點的。

然後初始時我們面向右側,因此左側一定有墻

,所以我們只需要一直沿著左側墻壁走即可。

由於這是交互題,因此我們可以弄出一個非常精簡的核心算法:

while (!reach_dest()) move_left();

以上參考於官方題解。

然後註意一下交互題的事項即可。千萬要註意請緩存,並且讀進來不要連換行一起,會出鍋的

CODE

#include<bits/stdc++.h>
using namespace std;
int n,m,l,d;
inline int reach_dest(void)
{
    puts("reach_dest"); fflush(stdout);
    int x; scanf("%d",&x); return
x; } inline void move_left(void) { puts("move_left"); fflush(stdout); int x; scanf("%d",&x); } int main() { scanf("%d%d%d%d",&n,&m,&l,&d); while (!reach_dest()) move_left(); return 0; }

LOJ #559. 「LibreOJ Round #9」ZQC 的迷宮