哪位高手能给讲解下这个有关问题为什么可以这么写代码来实现呢
谁能给讲解下这个问题为什么可以这么写代码来实现呢?
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) 判断是否满足题目条件,如果满足则输出当前的这种组合
你有哪里不明白?
------解决思路----------------------
把功能分成不同的代码模块,修改一下可以使逻辑更清晰一些
------解决思路----------------------
------解决思路----------------------
转换下规则,就很好求解了,参加: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参加
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参加