1 条题解
-
0
我们只能询问两次。
考虑第一次清理掉最左侧的一列和最下方的一行,通过
SSS...SDDD...D(WASD上左下右)判断并定位出这样的情况。第二次的思路如下。从左往右逐列探索是否有箱子,构造一个循环操作序列使得:从一列的最底下的格子出发,如果这一列有箱子则回到最底下,否则到达右侧一列的最底下。最后再一路往上走,顶到箱子的下方,即可揭示箱子位置。
该循环序列为
WWW...WAWDSSSS...SD,通过往箱子左侧顶一下区分这一列是否有箱子(注意最后一个D不能放在那一串S之前,不然可能向下走的时候撞到下一列的箱子)。记该序列为Q。则我们第二次询问的序列为
SSS...SDQQQ...QWWW...W。#include<bits/stdc++.h> using namespace std; string dup(int cnt,string x){ string y=""; for(int i=0;i<cnt;i++){ y+=x; } return y; } int n,m,x,y; signed main(){ios::sync_with_stdio(false),cin.tie(nullptr); cin>>n>>m; // round 1 cout<<"? "<<(string(n-1,'v')+string(m-1,'>'))<<endl; cin>>x>>y; if(x!=n-1){ cout<<"! "<<x+1<<" 0"<<endl; return 0; } if(y!=m-1){ cout<<"! "<<n-1<<" "<<y+1<<endl; return 0; } // round 2 cout<<"? "<<(string(n-1,'v')+">"+dup(m-2,string(n-1,'^')+"<^>v"+string(n-2,'v')+">")+string(n-1,'^'))<<endl; cin>>x>>y; cout<<"! "<<x-1<<" "<<y<<endl; return 0;}
- 1
信息
- ID
- 10936
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者