哪位高手能给讲解下这个有关问题为什么可以这么写代码来实现呢

谁能给讲解下这个问题为什么可以这么写代码来实现呢?
A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些人参加了竞赛:

(1)A参加时,B也参加;

(2)B和C只有一个人参加;

(3)C和D或者都参加,或者都不参加;

(4)D和E中至少有一个人参加;

(5)如果E参加,那么A和D也都参加。


---------------------------------------------------------------------------------

static void Main(string[] args)
{
  char[] name={'A','B','C','D','E'};
  int[] value = new int[5];
  for (value[0]=0;value[0]<2;value [0]++)
 for (value[1]=0; value[1] < 2; value[1]++)
   for (value[2]=0; value[2] < 2; value[2]++)
 for (value[3]=0; value[3] < 2; value[3]++)
   for (value[4]=0; value[4] < 2; value[4]++)
   {
  if ((value[1] >= value[0]) && (value[1] + value[2] == 1) && (value[2] == value[3]) && (value[3] + value[4]==1) && (value[4]==0 || value[4]==1 && value[0]==1 && value[3]==1))
  {
    for (int i = 0; i < 5; i++)
    {
  if (value[i]==1)
  {
    Console.WriteLine("{0}参加", name[i]);
  }
  else
  {
    Console.WriteLine("{0}不参加", name[i]);
  }
    }
  }
   }
}

------解决思路----------------------
利用5个循环穷举了5个人分别参加(1)和不参加(0) 的所有可能
并对每一种可能(if) 判断是否满足题目条件,如果满足则输出当前的这种组合

你有哪里不明白?
------解决思路----------------------
把功能分成不同的代码模块,修改一下可以使逻辑更清晰一些
var rule1 = new Func<bool, bool, bool, bool, bool, bool>((a, b, c, d, e) => !a 
------解决思路----------------------
 (a && b));
var rule2 = new Func<bool, bool, bool, bool, bool, bool>((a, b, c, d, e) => (b && !c) 
------解决思路----------------------
 (!b && c));
var rule3 = new Func<bool, bool, bool, bool, bool, bool>((a, b, c, d, e) => (c && d) 
------解决思路----------------------
 !(c && d));
var rule4 = new Func<bool, bool, bool, bool, bool, bool>((a, b, c, d, e) => d 
------解决思路----------------------
 e);
var rule5 = new Func<bool, bool, bool, bool, bool, bool>((a, b, c, d, e) => !e 
------解决思路----------------------
 (a && d));
int[] value = new int[5];
bool A, B, C, D, E;
for (value[0] = 0; value[0] <= 1; value[0]++)
    for (value[1] = 0; value[1] <= 1; value[1]++)
        for (value[2] = 0; value[2] <= 1; value[2]++)
            for (value[3] = 0; value[3] <= 1; value[3]++)
                for (value[4] = 0; value[4] <= 1; value[4]++)
                {
                    A = value[0] > 0;
                    B = value[1] > 0;
                    C = value[2] > 0;
                    D = value[3] > 0;
                    E = value[4] > 0;
                    if (rule1(A, B, C, D, E) && rule2(A, B, C, D, E) && rule3(A, B, C, D, E) && rule4(A, B, C, D, E) && rule5(A, B, C, D, E))
                    {
                        for (var i = 0; i < 5; i++)
                            if (value[i] == 1)
                                Console.Write((char)('A' + i));
                        Console.WriteLine("参加");
                    }
                }

------解决思路----------------------
 
bool[] st = new bool[5];
st[0] = true;
st[1] = st[0];
st[2] = !st[1];
st[3] = st[2];
st[4] = !st[3];

bool tr = st[4] == st[0] == st[3];
List<int> indx = new List<int>();
for (int i = 0; i < 5; i++)
{
      if (st[i] == tr)
             indx.Add(i);
}

------解决思路----------------------
转换下规则,就很好求解了,参加:1;不参加:0
(1)A参加时,B也参加:A + B != 1

(2)B和C只有一个人参加:B + C = 1

(3)C和D或者都参加,或者都不参加:C = D

(4)D和E中至少有一个人参加:D + E > 0

(5)如果E参加,那么A和D也都参加。if (E=1) E+A+B =3
以上条件作为函数,把E作为参数传入,看E的值为0还是1时返回true

最后结果是C,D参加