使用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]