盲人过独木桥

来源:互联网 发布:1990人口普查数据 编辑:程序博客网 时间:2024/05/02 00:34

同学发来的题目,让帮忙解决。一开始拿到这个题目,感觉无从下手(新手懵逼),感觉也比较麻烦。等脑子清醒后,再想这个题目,其实也不难,只要一个清晰的思路就可以迎刃而解。在此记录下,方便回忆复习。

题目描述

解题思路

源代码程序:

#include <iostream>using namespace std;#define MAX_PERSON_NUM 50   //最多人数#define begin 0             //独木桥 头#define end 100             //独木桥 尾class Person{public:    Person();public:    int location;       //位置    int patient_flag;   //患病标志    int left_brige_flag;//离开独木桥标志};//初始化(构造函数)Person::Person(){    this->location = 0;    this->patient_flag = 0;    this->left_brige_flag = 0;}int main(){    int i = 0,j = 0;    int patient_num = 0;    //患病人数    int end_flag = 0;       //结束标志    int left_brige_num = 0; //离开独木桥的人数    int person_num = 0;     //输入的盲人数    Person Parr[MAX_PERSON_NUM];    //测试案例    /*Parr[1].location = -10;    Parr[1].patient_flag = 1;    Parr[2].location = 8;    Parr[3].location = -20;    Parr[4].location = 12;    Parr[5].location = 25;*/    cout<<"输入盲人数量:";    cin>>person_num;    cout<<"输入一行("<<person_num<<"个)"<<"用空格隔开的整数(-100 —— 100):"<<endl;    //保存每个盲人的属性    for ( i = 1; i < person_num; i++)    {        cin>>Parr[i].location;//每个人的位置        if (i == 1)        {            Parr[1].patient_flag = 1;//第一个患病        }    }    while (end_flag == 0)    {        //1. 所有盲人 向前走一步 rate = 1m/s        for ( i = 1; i < person_num; i++)        {            if (Parr[i].left_brige_flag == 0)            {                Parr[i].location++;            }        }        //2. 是否相遇、患病        for ( i = 1; i < person_num;  i++)        {            for ( j = i+1; j < person_num; j++)            {                if (Parr[i].left_brige_flag == 1 || Parr[j].left_brige_flag == 1)                {                    continue;                }                if (abs(Parr[i].location) == abs(Parr[j].location))//相遇                {                    Parr[i].location = 0 - Parr[i].location;//反向                    Parr[j].location = 0 - Parr[j].location;                    if ((Parr[i].patient_flag == 1) || (Parr[j].patient_flag == 1))                    {                        Parr[i].patient_flag = 1;//患病                        Parr[j].patient_flag = 1;                    }                }            }        }        //3. 到达起点或者终点        for ( i = 1; i < person_num; i++)        {            if ((Parr[i].location == begin) || (Parr[i].location == end))            {                Parr[i].left_brige_flag = 1;            }        }        left_brige_num = 0;        //4. 结束条件        for ( i = 1; i < person_num; i++)        {            if (Parr[i].left_brige_flag == 1)            {                left_brige_num++;            }        }        if (left_brige_num == person_num - 1)        {            end_flag = 1;        }    }    //计算总的患病人数    for ( i = 1; i < person_num; i++)    {        if (Parr[i].patient_flag == 1)        {            patient_num++;        }    }    cout<<endl;    cout<<"patient_num:"<<patient_num<<endl;//输出患病人数    cout<<endl;    system("pause");    return 0;}

这道题目用C++来写还是比较简单的,正好可以利用面向对象的class。用C写也可以,需要创建一个PERSON的结构体,或者数组来解决,不过就不如C++容易理解和编写代码。

代码有可以优化的地方,也没有添加输入数据异常的判断。只是一个思路的实现。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大拇指又短又宽怎么办 削山药皮皮肤痒怎么办 脊柱侧弯20度怎么办 27岁脊柱侧弯怎么办 右侧侧脑室增宽怎么办 左侧脑室增宽该怎么办 腿上的血管堵塞怎么办 做b超看不清骶尾怎么办 孕中期羊水过少怎么办 心脏办膜关闭不全怎么办 9个月胎儿脑积水怎么办 怀孕三个月胎盘低置怎么办 怀孕第一个月打针了怎么办 唐氏筛查神经管缺陷高风险怎么办 门诊处方笺丢了怎么办 孕中期睡觉手麻怎么办 怀孕2个月了没胎心胎芽怎么办 怀孕腿疼的厉害怎么办 孕妇老是失眠多梦怎么办 孕妇会失眠多梦怎么办 怀孕5个月睡不着怎么办 6个月孕妇失眠怎么办 彩超脉络丛囊肿怎么办 双侧脉络丛囊肿怎么办 唐筛神经管缺陷高风险怎么办 雌激素低怎么办吃什么东西补 我怀了狗的孩子怎么办 结婚2年不要孩子怎么办 备孕一直没怀孕怎么办 刚生的婴儿打嗝怎么办 小孩40天黄疸高怎么办 婴儿身高长得慢怎么办 四个月的宝宝哭怎么办 孕39周羊水偏多怎么办 孕39周羊水浑浊怎么办 孕晚期羊水过少怎么办 怀孕脐带绕颈一周怎么办 nt检查宝宝趴着怎么办 四维胎儿有问题怎么办 怀孕70天没有胎心怎么办 怀孕20天不想要怎么办