您的位置:首页 > 职场人生

网红试题 2018年刑侦科目推理试题 的程序员解法

2018-03-07 21:28 134 查看


看到这个题目后第一个反应就是写个程序穷举一下不就出来了么,4的10次方对于cpu来说毛毛雨啊,推理能力什么的,不需要的。
回家闲着没事想到了就来写写看了,写完后想想难度确实没什么,主要是要细心,一开始就想着到底是用0~9还是1~10,最后决定按程序员套路0~9,被坑惨了,一直要-1,第一次运行居然是没结果,然后再对一遍,发现有一个没有-1,叹气~



以下是源码namespace _2018Exam
{
class Program
{
static void Main(string[] args)
{
Exam exam = new Exam();

int i = 0;//计数
do
{
i++;
if (exam.isRight())
{
exam.Print();
break;
}
} while (exam.Add());

Console.WriteLine("运行次数:" + i);
Console.ReadLine();
}
}

class Exam
{
//十题答案 0,1,2,3 代表 abcd
int[] array = new int[10];

/// <summary>
/// 4进制 ++
/// 全是3之后返回false退出
/// </summary>
public bool Add()
{
for(int i = 9;i>=0;i--)
{
if (array[i] < 3)
{
array[i]++;
break;
}

if (array[i] == 3)
{
if (i == 0)
return false;
array[i] = 0;
}
}
return true;
}

/// <summary>
/// 输出答案
/// </summary>
public void Print()
{
foreach (var i in array)
{
Console.Write((char)(i+'A') + " ");
}
Console.WriteLine();
}

public bool isRight()
{
if (T1() && T2() && T3() && T4() && T5() && T6() && T7() && T8() && T9() && T10())
return true;
return false;
}

#region 题目条件判断

/// <summary>
/// 这题的答案是
/// </summary>
/// <returns></returns>
bool T1()
{
return true;
}

/// <summary>
/// 第五题答案是
/// </summary>
/// <returns></returns>
bool T2()
{
int t5 = -1;
switch (array[1])
{
case 0:
t5 = 2;
break;
case 1:
t5 = 3;
break;
case 2:
t5 = 0;
break;
case 3:
t5 = 1;
break;
}
if (t5 == array[4])
return true;
else
return false;
}

/// <summary>
/// 哪一题答案与其他三项不同
/// </summary>
/// <returns></returns>
bool T3()
{
switch (array[2])
{
case 0:
if (array[5] == array[1] && array[1] == array[3])
{
if (array[2] != array[5])
return true;
}
break;
case 1:
if (array[2] == array[1] && array[1] == array[3])
{
if (array[2] != array[5])
return true;
}
break;
case 2:
if (array[2] == array[5] && array[5] == array[3])
{
if (array[1] != array[5])
return true;
}
break;
case 3:
if (array[2] == array[5] && array[5] == array[1])
{
if (array[2] != array[3])
return true;
}
break;
}
return false;
}
bool T4()
{
switch (array[3])
{
case 0:
if (array[0] == array[4])
return true;
break;
case 1:
if (array[1] == array[6])
return true;
break;
case 2:
if (array[0] == array[8])
return true;
break;
case 3:
if (array[5] == array[9])
return true;
break;
}
return false;
}
bool T5()
{
switch (array[4])
{
case 0:
if (array[4] == array[7])
return true;
break;
case 1:
if (array[4] == array[3])
return true;
break;
case 2:
if (array[4] == array[8])
return true;
break;
case 3:
if (array[4] == array[6])
return true;
break;
}
return false;
}
bool T6()
{
switch (array[5])
{
case 0:
if (array[7] == array[1] && array[7] == array[3])
return true;
break;
case 1:
if (array[7] == array[0] && array[7] == array[5])
return true;
break;
case 2:
if (array[7] == array[2] && array[7] == array[9])
return true;
break;
case 3:
if (array[7] == array[4] && array[7] == array[8])
return true;
break;
}
return false;
}
bool T7()
{
Dictionary<int, int> dic = new Dictionary<int, int>();
foreach(int i in array)
{
if (!dic.ContainsKey(i))
dic.Add(i, 0);
dic[i]++;
}
int min = dic.Min(s => s.Value);
//if (dic.Count(s => s.Value == min) > 1)
// return false;

switch (array[6])
{
case 0:
if (dic[2] == min)
return true;
break;
case 1:
if (dic[1] == min)
return true;
break;
case 2:
if (dic[0] == min)
return true;
break;
case 3:
if (dic[3] == min)
return true;
break;
}
return false;
}
bool T8()
{
switch (array[7])
{
case 0:
if (Math.Abs(array[0] - array[6]) > 1)//不相邻
return true;
break;
case 1:
if (Math.Abs(array[0] - array[4]) > 1)
return true;
break;
case 2:
if (Math.Abs(array[0] - array[1]) > 1)
return true;
break;
case 3:
if (Math.Abs(array[0] - array[9]) > 1)
return true;
break;
}
return false;
}

bool T9()
{
switch (array[8])
{
case 0:
if (array[0] != array[5] && array[5] == array[4])
return true;
if (array[0] == array[5] && array[5] != array[4])
return true;
break;
case 1:
if (array[0] != array[5] && array[9] == array[4])
return true;
if (array[0] == array[5] && array[9] != array[4])
return true;
break;
case 2:
if (array[0] != array[5] && array[1] == array[4])
return true;
if (array[0] == array[5] && array[1] != array[4])
return true;
break;
case 3:
if (array[0] != array[5] && array[8] == array[4])
return true;
if (array[0] == array[5] && array[8] != array[4])
return true;
break;
}
return false;
}

bool T10()
{
Dictionary<int, int> dic = new Dictionary<int, int>();
foreach (int i in array)
{
if (!dic.ContainsKey(i))
dic.Add(i, 0);
dic[i]++;
}
int min = dic.Min(s => s.Value);
int max = dic.Max(s => s.Value);

switch (array[9])
{
case 0:
if (max - min == 3)
return true;
break;
case 1:
if (max - min == 2)
return true;
break;
case 2:
if (max - min == 4)
return true;
break;
case 3:
if (max - min == 1)
return true;
break;
}
return false;
}

#endregion
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息