满意答案
/*************************************************************************************************************************
通过编写这个程序领悟到的几点:
1、编写程序不要急于着手写代码,必须先把算法设计出来,考虑清楚所有情况,在算法上先做到无懈可击才能编出完美的没有错误的代码。
2、子函数及其递归调用相当重要,如果没有子函数及其递归调用,本来一个很简单的程序将会变得复杂无序。
3、加深了对全局变量和局部变量的理解。
4、必须保证程序已经考虑到所有的情况,不能因为得到了结果就停止优化。这样会导致不可预料的bug,会对后期维护造成很大的难度。
5、注释是十分必要的,它极大地增强了代码的可读性,对程序的维护和修改有极大的帮助作用。
编写者:michelle
Q Q:824607076
日期:13.10.22
************************************************************************************************************************/
#include
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);
}
00分享举报