如代码,地毯的形状及坐标系在注释中已写明,一个递归的事

P1228 地毯填补问题

向之所欣 @ 2021-01-26 12:41:56

   #include<cstring>
   #include<iostream>
   #include<stdio.h>
   using namespace std;
   /*
   地毯型号 对应x y偏移地址 形状
   1     ->(1,1)              ┘
   2     ->(1,0)              └
   3     ->(0,1)              ┐
   4     ->(0,0)              ┌

   坐标系:
   ╔══════>y
   ║
   ║
   ∨
   x

   */
   void Solve(int nowsize,int px,int py,int x=0,int y=0)/*当前大小,公主位置,基址*/ //保证px<=nowsize&&py<=nowsize
   {
      if(nowsize==1)//1*1
         return;
      else 
      {
         int newsize=nowsize>>1;//折半
         if(px<=newsize&&py<=newsize)//公主在左上
         {
            printf("%d %d %d\n",newsize+x+1,newsize+y+1,1);//地毯1
            Solve(newsize,px,py,x,y);//对左上递归,公主在左上  px<=newsize;py<=newsize
            Solve(newsize,newsize,1,x,newsize+y);//对右上递归,端点视为公主
            Solve(newsize,1,newsize,newsize+x,y);//对左下递归,端点视为公主
            Solve(newsize,1,1,newsize+x,newsize+y);//对右下递归,端点视为公主
         }
         else if((px<=newsize)&&!(py<=newsize))//公主在右上
         {
            printf("%d %d %d\n",newsize+x+1,newsize+y,2);//地毯2
            Solve(newsize,newsize,newsize,x,y);//对左上递归
            Solve(newsize,px,py-newsize,x,newsize+y);//对右上递归  px<=newsize;py-newsize<=newsize
            Solve(newsize,1,newsize,newsize+x,y);//对左下递归
            Solve(newsize,1,1,newsize+x,newsize+y);//对右下递归
         }      
         else if(!(px<=newsize)&&(py<=newsize))//公主在左下
         {
            printf("%d %d %d\n",newsize+x,newsize+y+1,3);//地毯3
            Solve(newsize,newsize,newsize,x,y);//对左上递归
            Solve(newsize,newsize,1,x,newsize+y);//对右上递归
            Solve(newsize,px-newsize,py,newsize+x,y);//对左下递归  px-newsize<=newsize;py<=newsize
            Solve(newsize,1,1,newsize+x,newsize+y);//对右下递归
         }      
         else if(!(px<=newsize)&&!(py<=newsize))//公主在右下
         {
            printf("%d %d %d\n",newsize+x,newsize+y,4);//地毯4
            Solve(newsize,newsize,newsize,x,y);//对左上递归
            Solve(newsize,newsize,1,x,newsize+y);//对右上递归
            Solve(newsize,1,newsize,newsize+x,y);//对左下递归
            Solve(newsize,px-newsize,py-newsize,newsize+x,newsize+y);//对右下递归  px-newsize<=newsize;py-newsize<=newsize
         }
      }
   }

   int main()
   {
      int k;
      scanf("%d",&k);
      int size;//总大小
      size=1<<k;
      int px,py;
      scanf("%d%d",&px,&py);
      Solve(size,px,py);
   }

by esquigybcu @ 2021-01-26 12:43:18

tlqtj?


by qinyihao @ 2021-01-26 12:43:23

tlqtj sqlm


by Scintilla @ 2021-01-26 12:46:41

tlqtj sqlm


by 囧仙 @ 2021-01-26 13:27:32

tlqtj sqlm


by 银河AI @ 2021-01-26 13:34:36

tlqtj是啥意思


by hmzclimc @ 2021-01-26 14:00:38

tlqtj sqlm


by nalemy @ 2021-02-26 22:29:15

@银河AI ltqtj=讨论区题解 sqlm=删前留名


by ynliao @ 2021-08-11 21:17:29

虽然是讨论区题解,但是和我的思路完全一样,正好帮我纠错了,表示感谢


by henrywyh @ 2022-01-21 13:45:09

tlqtj sqlm


|