1. 程式人生 > >【互動題】Codeforces1023E Down or Right

【互動題】Codeforces1023E Down or Right

分析:

很簡單的互動題。。。

首先,題目保證有路徑可達,所以可以手動模擬DFS尋路的過程。

即:詢問當前節點的右邊一個是否可達目的地,如果可以走右邊
如果不行走下面。

這樣只需要2n2次詢問,就能找到路徑。

題目說要求詢問的點的距離不低於n1,無非就是正向走一次(從1,1出發)到距離為n-1為止,反向走一次(從n,n出發)到距離為n-1為止。

只要正向走的時候,保證先右後下,反向走的時候,保證先上後左,就一定能接在一起。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream> #include<cmath> #include<vector> #include<string> #include<set> #define SF scanf #define PF printf #define MAXN 200010 using namespace std; typedef long long ll; int n; char ord[MAXN],s[30]; bool ask(int xl,int yl,int xr,int yr){ PF("? %d %d %d %d\n",xl,yl,xr,yr); fflush(stdout); SF("%s"
,s); if(s[0]=='Y') return 1; else return 0; } int dis(int xl,int yl,int xr,int yr){ return abs(xl-xr)+abs(yl-yr); } int main(){ SF("%d",&n); int x=1,y=1; int cnt=0; while(dis(x,y,n,n)>=n){ if(y+1<=n&&ask(x,y+1,n,n)){ y++; ord[++cnt]='R'
; } else{ x++; ord[++cnt]='D'; } } cnt=2*n-1; x=n,y=n; while(dis(x,y,1,1)>=n){ if(x-1>0&&ask(1,1,x-1,y)){ x--; ord[--cnt]='D'; } else{ y--; ord[--cnt]='R'; } } PF("! "); for(int i=1;i<=2*n-2;i++) PF("%c",ord[i]); }