题解:B4322 [科大国创杯小学组 2025] 正方形划分
Charles_with_wkc · · 题解
思路
个人认为
op = 1
我这里考虑如下
我们发现每有一个字母题目就会去掉
int l1=1,l2=(1<<n),r1=1,r2=(1<<n);
这四个变量的作用是看这个
我们还需要算一下,答案在第几轮,但是这个比较好算。我们这里定义
至于,上面的 1<<n 这个是位运算,为
这里定义一个特殊的变量 pyl=1<<(n-1) 因为,我这里不停的缩小答案范围,我们对于
我们刚开始设置了
通过
代码
#include<bits/stdc++.h>
using namespace std;
long long t,x,y,l,nl1,nl2,nr1,nr2;
bool op,f;
string s;
void dfs1(long long id,long long l1,long long l2,long long r1,long long r2,long long pyl){
if(f) return ;
if(id==l){
f=1;
x=r1;
y=l1;
//我比较脑残写dfs1和dfs2的时候x和y写反了,将就看
//因为找到了以后l1=l2,r1=r2是一定的,所以无所谓
return ;
}
if(s[id]=='A') dfs1(id+1,l1,l2-pyl,r1,r2-pyl,pyl/2);
else if(s[id]=='B') dfs1(id+1,l1+pyl,l2,r1,r2-pyl,pyl/2);
else if(s[id]=='C') dfs1(id+1,l1,l2-pyl,r1+pyl,r2,pyl/2);
else dfs1(id+1,l1+pyl,l2,r1+pyl,r2,pyl/2);
return ;
}
void dfs2(long long id,long long l1,long long l2,long long r1,long long r2,long long pyl){
if(f) return ;
if(id==l){
f=1;//找到了
return ;
}
//A
nl1=l1;
nl2=l2-pyl;
nr1=r1;
nr2=r2-pyl;
if(nl1<=x&&x<=nl2&&nr1<=y&&y<=nr2){
s+='A';
dfs2(id+1,l1,l2-pyl,r1,r2-pyl,pyl/2);
}
//B
nl1=l1+pyl;
nl2=l2;
nr1=r1;
nr2=r2-pyl;
if(nl1<=x&&x<=nl2&&nr1<=y&&y<=nr2){
s+='B';
dfs2(id+1,l1+pyl,l2,r1,r2-pyl,pyl/2);
}
//C
nl1=l1;
nl2=l2-pyl;
nr1=r1+pyl;
nr2=r2;
if(nl1<=x&&x<=nl2&&nr1<=y&&y<=nr2){
s+='C';
dfs2(id+1,l1,l2-pyl,r1+pyl,r2,pyl/2);
}
//D
nl1=l1+pyl;
nl2=l2;
nr1=r1+pyl;
nr2=r2;
if(nl1<=x&&x<=nl2&&nr1<=y&&y<=nr2){
s+='D';
dfs2(id+1,l1+pyl,l2,r1+pyl,r2,pyl/2);
}
return ;
}
int main(){
/*
考场freopen
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
*/
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--){
cin>>op;
if(op==1){
cin>>s;
l=s.size();
cout<<l<<" ";
f=0;
dfs1(0,1,1<<l,1,1<<l,1<<(l-1));
cout<<x<<" "<<y<<" "<<endl;
}
else{
cin>>l>>x>>y;
swap(x,y);
//我比较脑残写dfs1和dfs2的时候x和y写反了,将就看
f=0;
s="";
//多测不清空,全WA等着哭
dfs2(0,1,1<<l,1,1<<l,1<<(l-1));
cout<<s<<endl;
}
}
return 0;
}