使用C#解逻辑题:小王、小张、小赵三个人是好朋友,他们中间其中一个人下海经商,一个人考上了重点大学,一个人参军了。此外他们还知道以下条件:小赵的年龄比士兵的大;大学生的年龄比小张小;小王的年龄和大学生

使用C#解逻辑题

小王、小张、小赵三个人是好朋友,他们中间其中一个人下海经商,一个人考上了重点大学,一个人参军了。此外他们还知道以下条件:小赵的年龄比士兵的大;大学生的年龄比小张小;小王的年龄和大学生的年龄不一样。请推出这三个人中谁是商人?谁是大学生?谁是士兵?

在线工具

1.实现理念

  • 我这个解法是穷举算法,即列举出所有组合结果,然后验证是否符合要求
  • 这个题目中有两个关键点:1.每个人的身份【士兵大学生商人】2.年龄【最小中间最大
  • 解题方式是,排列组合出所有符合要求的身份年龄组合,三层for循环,身份用枚举Identity来表示,年龄使用0~2表示
  • 找到符合要求的组合,就按照题目中已知条件对生成的组合生成判断语句,然后找到符合要求的那个组合将其输出

2.实现代码

static void Main(string[] args)
{
    var table = new Dictionary<Identity, Person>();
    for (var xw = new Person("小王"); xw.Move();)
    {
        table[xw.Identity] = xw;
        for (var xz = new Person("小张"); xz.Move();)
        {
            if (table.ContainsKey(xz.Identity)) continue;
            table[xz.Identity] = xz;
            for (var xzo = new Person("小赵"); xzo.Move();)
            {
                if (table.ContainsKey(xzo.Identity)) continue;
                table[xzo.Identity] = xzo;
                if (
                    //小赵的年龄比士兵的大;
                    xzo.Age > table[Identity.Soldier].Age &&
                    //大学生的年龄比小张小;
                    xz.Age > table[Identity.Undergraduate].Age &&
                    //小王的年龄和大学生的年龄不一样
                    xw.Age != table[Identity.Undergraduate].Age
                )
                {
                    Console.WriteLine(xw);
                    Console.WriteLine(xz);
                    Console.WriteLine(xzo);
                }

                table.Remove(xzo.Identity);
            }
            table.Remove(xz.Identity);
        }
        table.Remove(xw.Identity);
    }
}

public class Person
{
    public Person(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
    public Identity Identity { get; set; }
    public int Age { get; set; } = -1;

    public bool Move()
    {
        if (Age < 2)
        {
            Age++;
            return true;
        }

        if (Identity < Identity.Merchant)
        {
            Age = 0;
            Identity++;
            return true;
        }

        return false;
    }

    public override string ToString()
    {
        return $"{Name}={ReadDescription(Identity)}[{Age}]";
    }

    static string ReadDescription(Identity value)
        => typeof(Identity)
            .GetField(value.ToString())
            .GetCustomAttributes(typeof(DescriptionAttribute), false)
            .Cast<DescriptionAttribute>()
            .FirstOrDefault()?.Description;
}
public enum Identity
{
    /// <summary>
    /// 士兵
    /// </summary>
    [Description("士兵")] Soldier = 0,

    /// <summary>
    /// 大学生
    /// </summary>
    [Description("大学生")] Undergraduate = 1,

    /// <summary>
    /// 商人
    /// </summary>
    [Description("商人")] Merchant = 2,
}

输出结果

小王=士兵[0]
小张=商人[2]
小赵=大学生[1]

在线工具

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值