ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印
来源:互联网 发布:ios8.4.1完美越狱mac 编辑:程序博客网 时间:2024/06/06 13:19
今天给大家介绍几种有意思的算法,优化并不是很好,有想法的大家多多交流交流
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;}
第二、传入奇数字符,打印V字图形
//// 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;}
3、拔河比赛的规矩把所有人分成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
据说用平衡二叉树可以做,我想投个懒,就用递归穷举法捣鼓了捣鼓(不要笑我)
//// 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;}
1 0
- ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印
- 扑克发牌算法实现
- 扑克发牌算法实现
- 扑克发牌算法实现
- 【算法】扑克发牌算法实现
- j2me 扑克发牌算法实现
- Java 扑克发牌算法实现
- IOS面试算法题(4)——反斜对角线打印矩阵
- 魔术师发牌问题-数据结构和算法
- 算法期中——最小差
- 用PHP实现一个关于德州扑克算法的程序(一):发牌
- cocos2d 扑克发牌动画
- 洗牌和发牌算法
- iOS锄大地发牌算法
- IOS面试算法题(1)——N阶乘最后总位数的问题
- 发牌算法(java)
- 啊哈!算法—DFS—放扑克
- 算法期中 最小差
- iOS面试题5
- MFC中部分控件的使用
- Objective - C UITabbarController
- yii2项目前台页面开发中,用到的算法1 (例题解析)
- sessionStorage和localStorage区别
- ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印
- jquery 滚动特效
- Oracle开发环境搭建
- gcc/g++ 参数详解
- Extra约会大作战 浙江工商大学2015年新生赛
- 笔试面试题总结(四)--- 软件开发
- Android之Application简介
- Halcon视频学习2.1-- 图形变量
- Overrall Perspective