另一种简单的思路:
将情侣的空间位置要求转换为
101 1001 10001 100001四个数各自左移,然后或运算得到11111111的要求。
#include <stdio.h>
#define LOVERS_PAIR_1 (0b101)
#define LOVERS_PAIR_2 (0b1001)
#define LOVERS_PAIR_3 (0b10001)
#define LOVERS_PAIR_4 (0b100001)
#define LOVERS_PAIR_TARGET (0b11111111)
int main()
{
int x=0, y=0, z=0, t=0;
unsigned char result=0;
char order[8+1]={'\0'};
printf("符合:情侣Aa中间隔一个人,情侣Bb中间隔两个人,情侣Cc中间隔三个人,情侣Dd中间隔四个人的情况:\n");
for(x=0,result=0; x<6; x++)//x表示情侣Aa组合从右到左需空出的位置
{
result = LOVERS_PAIR_1<<x;
for(y=0; y<5; y++)//y表示情侣Bb组合从右到左需空出的位置
{
if (result&(LOVERS_PAIR_2<<y))
continue;
result = result|(LOVERS_PAIR_2<<y);
for (z=0; z<4; z++)//z表示情侣Cc组合从右到左需空出的位置
{
if (result&(LOVERS_PAIR_3<<z))
continue;
result = result|(LOVERS_PAIR_3<<z);
for(t=0; t<3; t++)//t表示情侣Dd组合从右到左需空出的位置
{
if (result&(LOVERS_PAIR_4<<t))
continue;
result = result|(LOVERS_PAIR_4<<t);
if (LOVERS_PAIR_TARGET==result)//找到了!转换后打印
{
order[8-x-1]='a';
order[8-(x+2)-1]='A';
order[8-y-1]='b';
order[8-(y+3)-1]='B';
order[8-z-1]='c';
order[8-(z+4)-1]='C';
order[8-t-1]='d';
order[8-(t+5)-1]='D';
order[8]='\0';
printf("%s\n", order);
}
}
}
}
}
}
程序输出:
符合:情侣Aa中间隔一个人,情侣Bb中间隔两个人,情侣Cc中间隔三个人,情侣Dd中间隔四个人的情况:
DACaBdcb
能拆一对是一对啊 -.-!