ios面试算法题(5)——扑克发牌、最小和差问题、V字图形打印

今天给大家介绍几种有意思的算法,优化并不是很好,有想法的大家多多交流交流


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;
}




 

你可能感兴趣的:(递归,随机,扑克随机发牌,最小和差)