P1228 地毯填补问题

#include <bits/stdc++.h>
using namespace std;
int k,x,y,n;
int pow2(int k){
    int sum=1;
    while(k--) sum*=2;
    return sum;
}
void f(int x,int y,int a,int b,int l)
{
    if(l==1) return;
    if(x-a<=l/2-1 && y-b<=l/2-1){
        printf("%d %d 1\n",a+l/2,b+l/2);
        f(x,y,a,b,l/2);
        f(a+l/2-1,b+l/2,a,b+l/2,l/2);
        f(a+l/2,b+l/2-1,a+l/2,b,l/2);
        f(a+l/2,b+l/2,a+l/2,b+l/2,l/2);
    }
    else if(x-a<=l/2-1 && y-b>l/2-1){
        printf("%d %d 2\n",a+l/2,b+l/2-1);
        f(a+l/2-1,b+l/2-1,a,b,l/2);
        f(x,y,a,b+l/2,l/2);
        f(a+l/2,b+l/2-1,a+l/2,b,l/2);
        f(a+l/2,b+l/2,a+l/2,b+l/2,l/2);
    }
    else if(x-a>l/2-1 && y-b<=l/2-1){
        printf("%d %d 3\n",a+l/2-1,b+l/2);
        f(a+l/2-1,b+l/2-1,a,b,l/2);
        f(a+l/2-1,b+l/2,a,b+l/2,l/2);
        f(x,y,a+l/2,b,l/2);
        f(a+l/2,b+l/2,a+l/2,b+l/2,l/2);
    }
    else{
        printf("%d %d 4\n",a+l/2-1,b+l/2-1);
        f(a+l/2-1,b+l/2-1,a,b,l/2);
        f(a+l/2-1,b+l/2,a,b+l/2,l/2);
        f(a+l/2,b+l/2-1,a+l/2,b,l/2);
        f(x,y,a+l/2,b+l/2,l/2);
    }
}
int main()
{
    cin>>k>>x>>y;;
    n=pow2(k);
    f(x,y,1,1,n);
    return 0;
}