[BZOJ4072][Wf2014]baggage

来源:互联网 发布:伊斯兰 知乎 编辑:程序博客网 时间:2024/05/17 03:38

题意


给定一排长度为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
原创粉丝点击