c语言练习题一道——稳定伴侣


/*有n 个男孩m1,m2,…,mn 与n 个女孩w1,w2,wn。每一个男孩mi 都依照喜爱这n
个女孩的程度列成一张表,最喜欢的女孩排在第1 位,最不喜爱的女孩排在第n 位;同样地,
每一个女孩wi 也依照她喜爱n 个男孩的程度列成一张表。请写一个程序,把每一个男孩与
女孩的喜爱表格读入,并且把男孩与女孩一一配对,使得:如果mp 与wq 是一对的话,那么
第一:对mp 的喜爱表格中排在wq 之前的女孩而言,她的伴侣在她的表格中一定排在mp 之
前;第二:对wq 的喜爱表格中排在mp 之前的男孩而言,他的伴侣在他的表格中一定排在
wq 之前。这就是稳定伴侣(Stable Marriage)问题。



解题思路就是依次表白,让妹子决定是否接受。然后循环让单身汉重新表白。*/


  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4
  5 /*----结构体----*/
  6 typedef struct girl{
  7     int Mate;//伴侣
  8     int Name;//名字
  9     int* LikeRank;//喜欢的对象排行榜
 10 }Girl;
 11
 12
 13
 14 typedef struct boy{
 15     int Mate;//伴侣
 16     int Name;//名字
 17     int* LikeRank;//喜欢的对象排行榜
 18 }Boy;
 19
 20
 21
 22 /*------全局变量-------*/
 23 int mateNumber;//情侣对数
 24 const int BoySize=sizeof(Boy);
 25 const int GirlSize=sizeof(Girl);
 26
 27 /*-----各个模块-------*/
 28 void initializeGirl(Girl* girl,int name);//初始化姑娘 将对象置为-1,名字为在数组中的次序,喜欢排行榜用shuffleArray打乱顺序
 29 void initializeBoy(Boy* boy,int name);//初始化汉子 将对象置为-1,名字为在数组中的次序,喜欢排行榜用shuffleArray打乱顺序
 30 void shuffleArray(int array[],int arraySize);//用随机数打乱数组顺序
 31 void girlShowLikeRank(int name,int* LikeRank);//姑娘打印喜欢排行版
 32 void boyShowLikeRank(int name,int* LikeRank);//汉子打印喜欢排行版
 33 bool girlSayYes(int girlName,int boyName,Girl* girls,Boy* boys);//姑娘是否同意,返回结果
 34 void boyFindLove(Girl* girls,Boy* boys,int boyName,int* LikeRank);//根据喜欢次序依次表白
 35 int findSequenceNumber(int* LikeRank,int boyName);//姑娘寻找此人在心目中的位置
 36 int findbachelor(Boy* boys);//寻找单身汉(mate为-1的),找到返回序号,没找到返回-1
 37 void printMate(Boy* boys);//根据汉子打印出配对结果
 38
 39 /*-------主函数-----*/
 40 /*
 41 首先输入情侣对数,根据个数然后初始化所有的人类
 42 然后先进行一轮汉子表白
 43 再无限循环寻找被抛弃的汉子直到所有人配对成功
 44 最后打印出配对结果
 45 */
 46 void main(){
 47     srand((unsigned)time( NULL ));
 48     printf("请输入有多少对情侣:");
 49     scanf("%d",&mateNumber);
 50     Girl* girls=(Girl *)malloc(GirlSize*mateNumber);
 51     Boy* boys=(Boy *)malloc(BoySize*mateNumber);
 52     for(int index=0;index<mateNumber;index++){
 53         initializeGirl(&girls[index],index);
 54         initializeBoy(&boys[index],index);
 55     }
 56     for(int index=0;index<mateNumber;index++)
 57         boyFindLove(girls,boys,index,boys[index].LikeRank);
 58
 59     int whoBachelor=findbachelor(boys);
 60     while(whoBachelor!=-1){
 61         boyFindLove(girls,boys,whoBachelor,boys[whoBachelor].LikeRank);
 62         whoBachelor=findbachelor(boys);
 63     };
 64     printMate(boys);
 65     system("pause");
 66 }
 67 /*-----程序函数----*/
 68 void initializeGirl(Girl* girl,int name)
 69 {
 70     girl->Name=name;
 71     girl->Mate=-1;
 72     girl->LikeRank=(int *)malloc(sizeof(int)*mateNumber);
 73     for(int i=0;i<mateNumber;i++)
 74     {
 75         girl->LikeRank[i]=i;
 76     }
 77     shuffleArray(girl->LikeRank,mateNumber);
 78     girlShowLikeRank(girl->Name,girl->LikeRank);
 79 }
 80 void initializeBoy(Boy* boy,int name)
 81 {
 82     boy->Name=name;
 83     boy->Mate=-1;
 84     boy->LikeRank=(int *)malloc(sizeof(int)*mateNumber);
 85     for(int i=0;i<mateNumber;i++)
 86     {
 87         boy->LikeRank[i]=i;
 88     }
 89     shuffleArray(boy->LikeRank,mateNumber);
 90     boyShowLikeRank(boy->Name,boy->LikeRank);
 91 }
 92
 93 void girlShowLikeRank(int name,int* LikeRank)
 94 {
 95     printf("我是姑娘%d,以下是我的喜欢排行榜:\n",name);
 96     for(int index=0;index<mateNumber;index++)
 97         printf("第%d位:%d\n",index,LikeRank[index]);
 98 }
 99 void boyShowLikeRank(int name,int* LikeRank)
100 {
101     printf("我是汉子%d,以下是我的喜欢排行榜:\n",name);
102     for(int index=0;index<mateNumber;index++)
103         printf("第%d位:%d\n",index,LikeRank[index]);
104 }
105
106 void boyFindLove(Girl* girls,Boy* boys,int boyName,int* LikeRank)
107 {
108     for(int index=0;index<mateNumber;index++)
109         if(girlSayYes(LikeRank[index],boyName,girls,boys))
110         {
111                 boys[boyName].Mate=LikeRank[index];
112                 break;
113         }
114 }
115
116 bool girlSayYes(int girlName,int boyName,Girl* girls,Boy* boys)
117 {
118     if(girls[girlName].Mate==-1){
119         printf("我是妹子%d,%d向我求爱,我没有对象于是同意\n",girlName,boyName);
120         girls[girlName].Mate=boyName;
121         return true;
122     }
123     else if(findSequenceNumber(girls[girlName].LikeRank,girls[girlName].Mate)>
124         findSequenceNumber(girls[girlName].LikeRank,boyName))
125     {
126         printf("我是妹子%d,%d向我求爱,我抛弃原配%d\n",girlName,boyName,girls[girlName].Mate);
127         boys[girls[girlName].Mate].Mate=-1; //抛弃原配
128         girls[girlName].Mate=boyName;
129         return true;
130     }
131     else {
132         printf("我是妹子%d,%d向我求爱,我更喜欢原配%d\n",girlName,boyName,girls[girlName].Mate);
133         return false;}
134 }
135 /*
136 寻找仍然单身的汉子
137 找到返回名字,没找到返回-1;
138 */
139 int findbachelor(Boy* boys)
140 {
141     for(int index=0;index<mateNumber;index++)
142     {
143         if(boys[index].Mate==-1) return index;
144     }
145     return -1;
146 }
147
148 void printMate(Boy* boys)
149 {
150     for(int index=0;index<mateNumber;index++)
151         printf("我是汉子%d,我的稳定妹子是%d\n",index,boys[index].Mate);
152 }
153
154 /*---工具函数--*/
155 int findSequenceNumber(int* LikeRank,int boyName)
156 {
157     for(int index=0;index<mateNumber;index++)
158         if(LikeRank[index]==boyName) return index;
159 }
160
161 void shuffleArray(int array[],int arraySize)
162 {
163     int i,j,T=100,tmp;
164     while(T--)
165     {
166         i=rand()%arraySize;
167         j=rand()%arraySize;
168         tmp=array[i];
169         array[i]=array[j];
170         array[j]=tmp;
171     }
172 }
时间: 2024-10-10 04:26:23

c语言练习题一道——稳定伴侣的相关文章

C语言练习题一道——生命游戏

生命游戏是一个很简单,但却是很有趣的程序习题.在一个四周都可以延伸到无限的 棋盘上的某个格子中会有一个有机体.每一个有机体在时间t 时,会依照环绕着它的8 个邻 居的特性而决定在时间t+1 时是否能生存下去.如果某一格在时间t 时: (1)有一个有机体,但是它的邻居少于或等于1 个,或者是大于3 个,那就会因为不 够稠密或太过稠密,这个有机体在时间t+1 时就会死亡:换言之,在t+1 时间,那一格中不 会存在有机体.下面就是几个在时间t+1 时会死亡的例子,如图1 所示. 图1 (2)有有机体在

C语言练习题

C语言练习题 1. 以下选项中,合法的一组C语言数值常量是(     ) A)028  .5e-3  .0xf B)12.  OXa23   4.5e0 C).177   4e1.5  Oabc D)0x8A  10,000  3.e5 2. 设整型变量x为7,则以下各表达式的值分别是(   ). (1)y=x%3        (2) y=(++x)/3       (3) y=x/3             (4) y=8-(--x) 3. 若已定义int x=5, y=9, z; 语句z=

稳定伴侣问题

问提描述: 有n个男孩m1,m2,…,mn 与n 个女孩w1,w2,wn.每一个男孩mi 都依照喜爱这n个女孩的程度列成一张表,最喜欢的女孩排在第1 位,最不喜爱的女孩排在第n 位:同样地,每一个女孩wi 也依照她喜爱n 个男孩的程度列成一张表.请写一个程序,把每一个男孩与女孩的喜爱表格读入,并且把男孩与女孩一一配对,使得:如果mp 与wq 是一对的话,那么,第一:对mp 的喜爱表格中排在wq 之前的女孩而言,她的伴侣在她的表格中一定排在mp 之前:第二:对wq 的喜爱表格中排在mp 之前的男孩

C程序设计语言练习题1-23

练习1-23 编写一个删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不能嵌套. 代码如下: #include <stdio.h> // 包含标准库的信息. #define MAXLINE 1000 // 每行最大字符数为1000个. #define BR 10 // 十个字符换一行. int getline(char line[], int maxline); int main() // 定义名为main的函数,它不接受参数值. { int len; in

C程序设计语言练习题1-10

练习1-10 编写一个将输入复制到输出的程序,并将起重的制表符替换为\t,把回退符替换成\b,把反斜杠替换为\\.这样可以将制表符和回退符以可见的方式显示出来. 代码如下: #include <stdio.h> // 包含标准库的信息. #include <conio.h> int main( void ) // 定义名为main的函数,它不接受参数值. { printf("======将输入的字符中的制表符替换为\t,退回符替换成\b,反斜杠替换为\\======\n&

C语言练习题1(关于快速排序,二分查找与运行时间)

刚刚完成师兄给的一道题目: 随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数),  结果输出查询的时间,以及是否查到 分享下自己的解题思路: 1,要懂得如何随机生成数 2,要了解快速排序以及二分法思想 3,要直到如何测试出程序运行时间 下面是自己写的代码,欢迎各位提出宝贵的意见以及见解,小生感激不尽 1 /* 2 本代码描述: 3 4 随机生成10000位数,进行快速排序后, 5 用二分查找法定位到某个要查询的数 6 (键盘输入某个要查询的数),

C程序设计语言练习题1-18

练习1-18 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行. 代码如下: #include <stdio.h> // 包含标准库的信息. #define MAXLINE 10 // 每行最大字符数为1000个. int getline(char line[], int maxline); int main() // 定义名为main的函数,它不接受参数值. { int len; int i; char line[MAXLINE]; while ((len = getli

C程序设计语言练习题1-9

练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数,它不接受参数值. { printf("======将输入的多个空格用一个空格代替======\n"); int c, space; while ((c = getchar()) != EOF) { if (c != ' ') putchar(c); // 若输入的字

C程序设计语言练习题1-7

练习1-7 编写一个打印EOF的值的程序. #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数,它不接受参数值. { // 输出EOF. printf("EOF对应的整形数是%d.\n",EOF); getch(); // 防止控制台一闪而过,需要接受任意字符后在关闭控制台. return 0; // 向执行环境返回一个整形,0代表执行成功. } 个人理解: 通过程序打印,可以看到EOF对应的整形数为-1.