用c语言编程实现,别出心裁的情侣拍照

要求:
1、有4对情侣,每对情侣都是男左女右
2、编号1的情侣之间有1人,编号2的情侣之间有2人、、、、以此类推,编号4的情侣之间有4人,因如何排列?
解题预定:4对情侣编号为1~8,1~4为男生,5~8为女生,1~5为一对,以此类推,a数组代表的位置为a1~a8,数组表示对应的人,a1=2表示第一个位置是2号男生。

另一种简单的思路:

将情侣的空间位置要求转换为

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
能拆一对是一对啊 -.-!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-25
#include<stdio.h>
int a[8]={0};
int go(int i);

void bprintf(){
    int k=0;
    for(;k<8;k++)
        printf("%d ",a[k]);
    printf("\n");
}

int go(int i)
{

    int j=0;
    int ret=0;
    while(j<7-i){ //尝试符合条件的所有座位          
        if(a[j]==0&&a[j+i+1]==0){//can sit

            a[j]=i;//坐下
            a[j+i+1]=i+4;
            if(i==4)
                bprintf();//全部坐下
            else
                go(i+1);//下一对
            a[j]=a[j+i+1]=0;//离开尝试下一可以坐的座位
        }
        j++;
    }
    return ret;
}

int main()
{
    go(1);
return 0;
}

第2个回答  推荐于2016-08-24
/*************************************************************************************************************************
通过编写这个程序领悟到的几点:
1、编写程序不要急于着手写代码,必须先把算法设计出来,考虑清楚所有情况,在算法上先做到无懈可击才能编出完美的没有错误的代码。
2、子函数及其递归调用相当重要,如果没有子函数及其递归调用,本来一个很简单的程序将会变得复杂无序。
3、加深了对全局变量和局部变量的理解。
4、必须保证程序已经考虑到所有的情况,不能因为得到了结果就停止优化。这样会导致不可预料的bug,会对后期维护造成很大的难度。
5、注释是十分必要的,它极大地增强了代码的可读性,对程序的维护和修改有极大的帮助作用。
编写者:michelle
Q Q:824607076
日期:13.10.22
************************************************************************************************************************/
#include <stdio.h>
int a[4][2];//情侣数组用来存放情侣序号例如a[0][0]表示第一对情侣的男孩
int b[8];//位置数组,八个按顺序排列的位置,如b[0]表示第一个位置,b[0]=0表位置没有被占,1表示被占
int num=0;//找到的可能结果总数
//第i对情侣男孩从第p位开始坐的排列
void arrange(int i ,int p)
{
int j;
int m;
int n;
int q;
for(j=p;j<8;j++)
{
//有适合的位置
if((i+j+2<8)&&(0==b[j])&&(0==b[i+j+2]))
{

a[i][0]=j;//男孩获得座位序号
b[j]=1;//男孩坐上座位
a[i][1]=i+j+2;//女孩获得座位序号
b[i+j+2]=1; //女孩坐上座位
if(3!=i)//如果不是最后一对情侣就让下一对情侣找座位
{
arrange(i+1,0);
}
else//如果是最后一对情侣,公布结果,并寻找下一种可能性
{
//公布结果
num++;//结果个数加1
for(m=0;m<4;m++)
for(n=0;n<2;n++)
{
printf("%d",a[m][n]+1);
}
printf("\n");
//寻找下一种可能性
b[a[i-1][0]]=0;//前一对情侣男孩离开座位
b[a[i-1][1]]=0;//前一对情侣女孩离开座位
q=a[i-1][0];//获得前一对情侣男孩上一次的座位号
a[i-1][0]=0;//前一对情侣男孩上交座位序号
a[i-1][0]=0;//前一对情侣女孩上交座位序号
arrange(i-1,q+1);//上一对情侣接着上次找的位置往下找座位
}
break;//这一对情侣停止找座位
}
}
//没有找到座位
if(8==j)
{
//如果是第一对情侣已经找不到座位,公布可能结果个数,结束找座位,准备照相
if(0==i)
{
printf("共找到的结果个数为%d\n",num);
// *********程序结束于这里**********
}
//如果不是第一对情侣已经找不到座位,让上一对情侣重新找座位
else
{
b[a[i-1][0]]=0;//前一对情侣男孩离开座位
b[a[i-1][1]]=0;//前一对情侣女孩离开座位
q=a[i-1][0];//获得前一对情侣男孩上一次的座位号
a[i-1][0]=0;//前一对情侣男孩上交座位序号
a[i-1][0]=0;//前一对情侣女孩上交座位序号
arrange(i-1,q+1);//上一对情侣接着上次找的位置往下找座位
}
}
}
//主函数 **********程序开始于这里************
main()
{
printf("各对情侣男女的位置编号分别为(情侣内部男女可互换,默认男士在前):\n");
arrange(0,0);
}本回答被提问者采纳
相似回答