1 条题解

  • 0
    @ 2026-5-6 15:08:53

    我们只能询问两次。

    考虑第一次清理掉最左侧的一列和最下方的一行,通过 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
    上传者