求纠错

P1228 地毯填补问题

CDX0721 @ 2024-10-24 23:45:45

#include <iostream>
#include <cmath>
using namespace std;
int k,x,y;
int pow2[11]={0};
int xp=0,yp=0;
void put(int x,int y,int n,int type)
{
    if (n==1)
    {
        printf("%d %d %d\n",x,y,type);
    }
    else
    {
        put(x,y,n-1,type);
        switch (type)
        {
            case 1:
            {
                put(x-pow2[n-2],y-pow2[n-2],n-1,1);
                put(x,y+1-pow2[n],n-1,2);
                put(x+1-pow2[n],y,n-1,3);
            }break;
            case 2:
            {
                put(x-pow2[n-2],y+pow2[n-2],n-1,2);
                put(x+1-pow2[n],y,n-1,4);
                put(x,y-1+pow2[n],n-1,1);
            }break;
            case 3:
            {
                put(x+pow2[n-2],y-pow2[n-2],n-1,3);
                put(x-1+pow2[n],y,n-1,1);
                put(x,y-pow2[n]+1,n-1,4);
            }break;
            case 4:
            {
                put(x+pow2[n-2],y+pow2[n-2],n-1,4);
                put(x-1+pow2[n],y,n-1,2);
                put(x,y-1+pow2[n],n-1,3);
            }break;
        }
    }
}
int sch(int n)//use no.sch() carpet
{
    n--;
    if (x<=pow2[n])
    {
        if (y<=pow2[n])
            return 1;
        else
            return 2;
    }
    else
    {
        if (y<=pow2[n])
            return 3;
        else
            return 4;
    }
}
int main(void)
{
    cin>>k>>x>>y;
    for (int i=0;i<11;i++)
    {
        pow2[i]=pow(2,i);
    }
    while (k!=1)
    {
        switch (sch(k))
        {
            case 1:put(pow2[k]+xp,pow2[k]+yp,k,1);
            break;
            case 2:put(pow2[k]+xp,1+yp,k,2);
            yp+=pow2[k-1];
            break;
            case 3:put(1+xp,pow2[k]+yp,k,3);
            xp+=pow2[k-1];
            break;
            case 4:put(1+xp,1+yp,k,4);
            xp+=pow2[k-1];
            yp+=pow2[k-1];
            break;
        }
        x%=pow2[k-1];
        y%=pow2[k-1];
        k--;
    }
    return 0;
}

样例跑的没问题,但是提交上一串WA4,求修改


|