[BZOJ4072][Wf2014]baggage

题意

给定一排长度为4n的格子,编号从-2n+1到2n
每个编号为正的格子中有一个物品,其中每个编号为奇数的格子中有一个B类物品,编号为偶数的格子中有一个A类物品,你只能进行一种操作:选择某两个相邻的格子,要求这两个格子中都有物品,然后移动到另外两个相邻的空格子中,不能改变两个格子的相对位置,要求进行最少的操作使得所有物品以AAA…ABBB…B(n个A和n个B)的形式排列在一起
输出一种可行方案


可以先构造出n=4~7的方案

因为存在方案使__BABA(BABA……BA)BABA
可以变成AAAA__(BABA……BA)BBBB

递归输出括号中的序列的方案。

#include <cstdio>
#define pt(x,y) printf("%d to %d\n",x,y)

int n;

void solve(int l,int r){
    if(r-l+1==6){pt(2,-1);pt(5,2);pt(3,-3);return;}
    if(r-l+1==8){pt(l+5,l-2);pt(l+2,l+5);pt(l-1,l+2);pt(l+6,l-1);return;}
    if(r-l+1==10){pt(l+7,l-2);pt(l+2,l+7);pt(l+5,l+2);pt(l-1,l+5);pt(l+8,l-1);return;}
    if(r-l+1==12){pt(l+9,l-2);pt(l+6,l+9);pt(l+1,l+6);pt(l+5,l+1);pt(l-1,l+5);pt(l+10,l-1);return;}
    if(r-l+1==14){pt(l+7,l-2);pt(l+4,l+7);pt(l+11,l+4);pt(l+2,l+11);pt(l+8,l+2);pt(l-1,l+8);pt(l+12,l-1);return;}
    pt(r-2,l-2);pt(l+2,r-2);solve(l+4,r-4);pt(l-1,r-5);pt(r-1,l-1);
}

int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.out","w",stdout);
    #endif
    return scanf("%d",&n),solve(1,n<<1),0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值