https://ac.nowcoder.com/acm/contest/57358/H
递归搜索构造
#include "bits/stdc++.h"
using namespace std;
int get(int a,int b){
if(a==0||b==0) return 0;
return a/b+get(b,a%b);
}
struct cube{
int x,y;
int k;
};
vector<cube> ans;
int lnext[1005];
void dfs(int x1,int y1,int x2,int y2){
if(y2-y1==x2-x1){
if(x2-x1==1) return;
int temp=lnext[x2-x1];
dfs(x1,y1,x1+temp,y1+temp);
dfs(x1+temp,y1,x2,y1+temp);
dfs(x1,y1+temp,x1+temp,y2);
dfs(x1+temp,y1+temp,x2,y2);
cube a;
a.x=x1,a.y=y1,a.k=x2-x1;
ans.push_back(a);
return;
}
else if(y2-y1>x2-x1){
int temp=x2-x1;
dfs(x1,y1,x2,y1+temp);
dfs(x1,y1+temp,x2,y2);
}
else{
int temp=y2-y1;
dfs(x1,y1,x1+temp,y2);
dfs(x1+temp,y1,x2,y2);
}
}
int main(){
int n;
cin>>n;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(2+get(i,i-j)*2<=50){
lnext[i]=j;
break;
}
}
}
dfs(0,0,n,n);
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i].x+1<<" "<<ans[i].y+1<<" "<<ans[i].k<<endl;
}
}