今天给大家介绍几种有意思的算法,优化并不是很好,有想法的大家多多交流交流
1、程序模拟将52张牌随机发送给四个玩家(大小王除外)
// // main.c // randPoke // // Created by cuixuerui on 15/12/24. // Copyright (c) 2015年 cuixuerui. All rights reserved. // #include <stdio.h> #include <time.h> #include <stdlib.h> typedef struct{ int colo; int num; } POKE; char *color[4]={"♠️","♣️","♥️","♦️"}; char *num[13]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; int main(int argc, const char * argv[]) { srand((int)time(NULL)); POKE poke[52]; for(int c=0;c<52;c++) { //首先初始化,将所有的牌赋上不相关的值 poke[c].num=14; poke[c].colo=5; } /* 思想:将0-51分成四段 玩家1:0-12 玩家2:13-25 玩家3:26-38 玩家4:39-51 给每个玩家随机发牌,然后判断0-52中有没有重复的牌,没有则发牌,有则重新产生随机数 */ int count=0; int j=0; int k=0; while (count<=51) { int num=rand()%13;//随机发牌 int color=rand()%4; int flag=0; //重牌标志 for (int i=0; i<52; i++) { if (poke[i].colo==color&&poke[i].num==num) { flag=1; //有重牌 } } if (flag==0) {//如果没有重牌的话 poke[j].colo=color; poke[j].num=num; j=j+13;//转到第二个玩家 count++;//总的牌数 if (j>39+k) {//第一轮发牌完毕,开始第二轮发牌 k++; j=k; } } } for (int i=0; i<52; i++) { if (i==0) { printf("玩家1\n"); }else if(i==13) { printf("\n玩家2\n"); }else if (i==26) { printf("\n玩家3\n"); }else if (i==39) { printf("\n玩家4\n"); } printf("%s%s ",color[poke[i].colo],num[poke[i].num]); } return 0; }
// // main.c // 第五题 // // Created by qianfeng on 15/12/8. // Copyright (c) 2015年 cuixuerui. All rights reserved. // #include <stdio.h> /* 5.实现函数,传入奇数字符的字符串,打印图形。(15分) 传入:"abcdefg" 打印: a g b f c e d */ int inputAndLength(char str[]); int main(int argc, const char * argv[]) { char str[20]; //int i=0; int length; printf("请输入字符串(奇数个):\n"); //获取长度 length=inputAndLength(str); //判断是否是奇数字符,如果不是奇数字符,重新输入 while (length%2==0) { printf("输入错误!请输入奇数个字符:\n"); length=inputAndLength(str); } //length/2+1表示输入的层数,7个字符只需要输入4层就够了 for(int i=0; i<length/2+1; i++) { //字母前边的空格 for (int j=0; j<=i-1; j++) { printf(" "); } //输出前边字母 printf("%c",str[i]); /* //输出两个字母中间的空格 //(length-2)-2*i表示空格与字母位置的关系 比如:length=7 str[0]-----5个空格 str[1]-----3个空格 str[2]-----1个空格 */ for (int j=(length-2)-2*i; j>0;j--) { printf(" "); } //输出后边的字母 if (i!=length/2) { printf("%c",str[length-i-1]); } //输出最后边换行 printf("\n"); } return 0; } int inputAndLength(char str[]) { int i=0; do{ scanf("%c",&str[i]); //如果结尾是回车则退出循环 if (str[i]=='\n') { break; } i++; }while(1); return i; }
据说用平衡二叉树可以做,我想投个懒,就用递归穷举法捣鼓了捣鼓(不要笑我)
// // main.c // 划分最小和差问题(拔河分配问题) // // Created by qianfeng on 15/12/15. // Copyright (c) 2015年 cuixuerui. All rights reserved. // #include <stdio.h> #define MAX_SIZE 125 /* 拔河比赛的规矩把所有人分成A B两队,力气大的一方胜出 由于一开始不知道每个人力量多大,所以主持人分组定下如下策略: 根据每个人的体重尽可能的分配平均 分配的策略是: 1. A B两队人数相差 <= 1 2. A B两队人总量之差绝对值最小 ============== 比如某班级有N(可为奇数或者偶数)个人, 编号为0, 1, 2, ... (N-1) 每个人都有自身的体重, 比如 W0, W1, W2, ... W(N-1) 请问如何分配比赛两队的人数,保证双方人体重总和相差最小 打印出 A B两队的总体重(从小到大) 比如: 有7个人, 体重分别为 100 90 200 220 130 120 110 输出为(先输出体重小的): 470 500 请设计一个程序,根据人数自动来进行统计 注意输入的时候 第一个是输入的人个数,比如7个人 后续输入的是7个人的体重 7 100 90 200 220 130 120 110 */ int addNum(int num[],int m,int k); float avg; int a[100],end; int temp; int result=0; int main(int argc, const char * argv[]) { int sum=0; int weight[20]; weight[0]=2; for (int i=0; i<=weight[0]; i++) { scanf("%d",&weight[i]); } int length=weight[0]; //求和 for(int i=1;i<=length;i++) { sum=sum+weight[i];//sum为数列的总和 } avg=sum/2; end=length/2; temp=avg; int num1=addNum(weight, length, end); int num2=sum-num1; int min=num1<num2?num1:num2; printf("%d\n%d",min,sum-min); return 0; } /* 取出数组num[]中任意的k个数相加,求和 */ int addNum(int num[],int m,int k) { int i,j; int sum=0; for(i=m;i>=k;i--) { a[k]=num[i];//最后一个位置的元素可以取m,m-1,m-2.....k if(k>1) addNum(num,i-1,k-1);//递归调用 else { sum=0; for(j=1;j<=end;j++) { sum=sum+a[j]; } //printf("%d \n",sum); int sub=sum-avg; if (sub<0) { sub=-sub;//取差值的绝对值 } if (sub<temp) { temp=sub; result=sum; } //printf("结果是:%d\n",result); //return result; } } return result; }