//A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
//人参加了竞赛:
// (1)A参加时,B也参加;
// (2)B和C只有一个人参加;
// (3)C和D或者都参加,或者都不参加;
// (4)D和E中至少有一个人参加;
// (5)如果E参加,那么A和D也都参加
网上有两个答案,但认为这个答案要好一些
因为它更多是应用面向对象的方法,但下面的代码有问题 ,也有几名看不懂,请高人帮改正一下!class Program2
{
static void Main(string[] args)
{
student[] stu =
{
new student("A"),
new student("B"),
new student("C"),
new student("D"),
new student("E")
};
games(stu);
for (int i = 0; i < stu.Length; i++)
{
Console.Write(stu[i].name);
if (stu[i].join)
Console.WriteLine("去了");
else
Console.WriteLine("没去");
}
}
static void games(student[] stu)
{
if (stu[0].join)
stu[1].join = true; if (stu[1].join)
stu[2].join = false;
else
stu[2].join = true; stu[3].join = stu[2].join; if (!stu[3].join)
stu[4].join = true; if (stu[4].join)
{
if (stu[0].join && stu[3].join)
return;
else // 为什么要写下面两行
{
stu[0].join = false;
games(stu);
}
}
}
}
//人参加了竞赛:
// (1)A参加时,B也参加;
// (2)B和C只有一个人参加;
// (3)C和D或者都参加,或者都不参加;
// (4)D和E中至少有一个人参加;
// (5)如果E参加,那么A和D也都参加
网上有两个答案,但认为这个答案要好一些
因为它更多是应用面向对象的方法,但下面的代码有问题 ,也有几名看不懂,请高人帮改正一下!class Program2
{
static void Main(string[] args)
{
student[] stu =
{
new student("A"),
new student("B"),
new student("C"),
new student("D"),
new student("E")
};
games(stu);
for (int i = 0; i < stu.Length; i++)
{
Console.Write(stu[i].name);
if (stu[i].join)
Console.WriteLine("去了");
else
Console.WriteLine("没去");
}
}
static void games(student[] stu)
{
if (stu[0].join)
stu[1].join = true; if (stu[1].join)
stu[2].join = false;
else
stu[2].join = true; stu[3].join = stu[2].join; if (!stu[3].join)
stu[4].join = true; if (stu[4].join)
{
if (stu[0].join && stu[3].join)
return;
else // 为什么要写下面两行
{
stu[0].join = false;
games(stu);
}
}
}
}
不知这样理解对不?
{
stu[0].join = false;
games(stu);
}结果:(人脑)
A,B,C,D,E
0,0,1,1,0还可以取位进行穷举的.
00000->11111
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;namespace ConsoleApplication
{
class Program
{
static List<Student> Students = new List<Student>();
const int MAX_COUNT = 31;
const int LENGTH = 5;
static void Main(string[] args)
{
Students.Add(new Student("A"));
Students.Add(new Student("B"));
Students.Add(new Student("C"));
Students.Add(new Student("D"));
Students.Add(new Student("E")); for (int i = 0; i < MAX_COUNT; i++)
{
//00000000( 十进制 0) --> 00011111 ( 十进制 31) 取 5码
for (int j = 0; j < LENGTH; j++)
{
Students[j].Join = GetBinaryString(
Convert.ToString(i, 2)
)[7 - j] == '1' ? true : false;
}
FindStudents(Students);
}
Console.ReadKey();
} static char[] GetBinaryString(string s)
{
switch (s.Length)
{
case 1: s = "0000000" + s; break;
case 2: s = "000000" + s; break;
case 3: s = "00000" + s; break;
case 4: s = "0000" + s; break;
case 5: s = "000" + s; break;
case 6: s = "00" + s; break;
case 7: s = "0" + s; break;
}
return s.ToCharArray();
} static void FindStudents(List<Student> s)
{
//(1)A参加时,B也参加;
if (s[0].Join && !s[1].Join) return; //(2)B和C只有一个人参加;
if ((s[1].Join && s[2].Join) | (!s[1].Join && !s[2].Join)) return; //(3)C和D或者都参加,或者都不参加;
if ((s[2].Join && !s[3].Join) | (!s[2].Join && s[3].Join)) return; //(4)D和E中至少有一个人参加;
if ((!s[3].Join && !s[4].Join)) return; //(5)如果E参加,那么A和D也都参加;
if (s[4].Join)
{
if (!(s[0].Join && s[3].Join)) return;
} //显示结果
var Result = from o in s
select new { Msg = o.Name + (o.Join == true ? "去了" : "没去") };
Console.WriteLine("======我是分割线======");
foreach (var r in Result)
{
Console.WriteLine(r.Msg);
}
}
} class Student
{
public string Name { get; set; }
public bool Join { get; set; }
public Student(string Name)
{
this.Name = Name;
}
}
}