C++解2018刑偵科推理卷(閒的DT系列)
阿新 • • 發佈:2019-01-25
刑偵推理卷的C++解答
本文程式碼除錯環境:
VS2017 + Windows 7
不能執行的請注意C++的版本,至少C++ 11
問題描述
問題思路
用遞迴的話,一不小心就會Stack Overflow。
解答程式*(全)
// ConsoleApplication1.cpp: 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
// ======================= 宣告與初始化 =======================
const bool flag[10] = { true, false, true, false, true, true, true, false, true, true}; // 控制是否遍歷
int Q1(const bool control = flag[0]);
int Q2(const bool control = flag[1]);
int Q3(const bool control = flag[2]);
int Q4(const bool control = flag[3]);
int Q5(const bool control = flag[4]);
int Q6(const bool control = flag[5]);
int Q7(const bool control = flag[6]);
int Q8(const bool control = flag[7]);
int Q9(const bool control = flag[8]);
int Q10(const bool control = flag[9]);
int(*pf[])(const bool control) = { Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10 };
void show();
void resolve();
int code();
void decode(int num);
char translate(int in);
int a[10] = { 0 };
// ======================= 題目邏輯部分 =======================
// 第1題
int Q1(const bool control)
{
return a[0];
}
// 第2題
int Q2(const bool control)
{
if (control)
return a[1];
switch (Q5())
{
case 1:
return 3;
break;
case 2:
return 4;
break;
case 3:
return 1;
break;
case 4:
return 2;
break;
default:
return 0;
break;
}
}
// 第3題
int Q3(const bool control)
{
if (control)
return a[2];
int t4 = Q4();
int t2 = Q2();
int t3 = Q3();
int t6 = Q6();
int val = (t2 == t3) + (t2 == t4) + (t2 == t6); // 唯一性檢查
if (val == 0)
{
return 3;
}
else if (val == 2)
{
if (t2 != t3)
return 1;
else if (t2 != t4)
return 4;
else if (t2 != t6)
return 2;
else
return 0;
}
else
{
return 0;
}
}
// 第4題
int Q4(const bool control)
{
if (control)
return a[3];
int t5 = Q5();
int t8 = Q8();
int t9 = Q9();
int t7 = Q7();
int t1 = Q1();
int t6 = Q6();
int t2 = Q2();
int t10 = Q10();
int val = (t1 == t5) + (t2 == t7) + (t1 ==t9) + (t6 == t10); // 唯一性檢查
if (val == 1)
{
if (t1 == t5)
return 1;
else if (t2 == t7)
return 2;
else if (t1 == t9)
return 3;
else if (t6 == t10)
return 4;
}
return 0;
}
// 第5題
int Q5(const bool control)
{
if (control)
return a[4];
int t5 = Q5();
int t8 = Q8();
int t4 = Q4();
int t9 = Q9();
int t7 = Q7();
int val = (t5 == t8) + (t5 == t4) + (t5 == t9) + (t5 == t7); // 唯一性檢查
if (val == 1)
{
if (t5 == t8)
return 1;
else if (t5 == t4)
return 2;
else if (t5 == t9)
return 3;
else if (t5 == t7)
return 4;
}
return 0;
}
// 第6題
int Q6(const bool control)
{
if (control)
return a[5];
int t8 = Q8();
int t6 = Q6();
int t1 = Q1();
int t5 = Q5();
int t9 = Q9();
int t2 = Q2();
int t10 = Q10();
int t3 = Q3();
int t4 = Q4();
int f1 = (t8 == t2) * (t2 == t4);
int f2 = (t8 == t1) * (t1 == t6);
int f3 = (t8 == t3) * (t3 == t10);
int f4 = (t8 == t5) * (t5 == t9);
int val = f1 + f2 + f3 + f4; // 唯一性檢查
if (val == 1)
{
if (f1)
return 1;
else if (f2)
return 2;
else if (f3)
return 3;
else if (f4)
return 4;
}
return 0;
}
// 第7題:尚未修復重複問題
int Q7(const bool control)
{
if (control)
return a[6];
int a, b, c, d;
a = 0; b = 0; c = 0; d = 0;
for (int i = 0; i < 10; i++)
{
switch (pf[i](flag[i]))
{
case 1:
a++;
break;
case 2:
b++;
break;
case 3:
c++;
break;
case 4:
d++;
break;
default:
break;
}
}
if (a < b)
{
if (a < c)
{
if (a < d)
return 3;
else
return 4;
}
else
{
if (c < d)
return 1;
else
return 4;
}
}
else
{
if (b < c)
{
if (b < d)
return 2;
else
return 4;
}
else
{
if (c < d)
return 1;
else
return 4;
}
}
}
// 第8題
int Q8(const bool control)
{
if (control)
return a[7];
int t2 = Q2();
int t1 = Q1();
int t5 = Q5();
int t7 = Q7();
int t10 = Q10();
if (t1*t2*t5*t7*t10 == 0)
return 0;
int f1 = (abs(t1 - t7) != 1);// 不相鄰為1,反之為0
int f2 = (abs(t1 - t5) != 1);
int f3 = (abs(t1 - t2) != 1);
int f4 = (abs(t1 - t10) != 1);
int val = f1+f2+f3+f4; // 唯一性檢查
if (val == 1)
{
if (f1)
return 1;
else if (f2)
return 2;
else if (f3)
return 3;
else if (f4)
return 4;
}
return 0;
}
// 第9題
int Q9(const bool control)
{
if (control)
return a[8];
int t1 = Q1();
int t6 = Q6();
int t5 = Q5();
bool val_X = (t1 == t6);
bool val_Y;
for (int X = 0; X < 10; X++)
{
val_Y = (t5 == pf[X](flag[X]));
if (val_X != val_Y)
{
switch (X + 1)
{
case 6:
return 1;
break;
case 10:
return 2;
break;
case 2:
return 3;
break;
case 9:
return 4;
break;
default:
break;
}
}
}
return 0;
}
// 第10題
int Q10(const bool control)
{
if (control)
return a[9];
int a, b, c, d;
a = 0; b = 0; c = 0; d = 0;
for (int i = 0; i < 10; i++)
{
switch (pf[i](flag[i]))
{
case 1:
a++;
break;
case 2:
b++;
break;
case 3:
c++;
break;
case 4:
d++;
break;
default:
break;
}
}
int gap[6] = { abs(a - b), abs(a - c), abs(a - d), abs(b - c), abs(b - d), abs(c - d) };
int max = gap[0]; // 最多與最少次數之差即為差值的最大值,故使用冒泡找最大
for (int item: gap)
{
max = item > max ? item : max;
}
switch (max)
{
case 3:
return 1;
break;
case 2:
return 2;
break;
case 4:
return 3;
break;
case 1:
return 4;
break;
default:
break;
}
return 0;
}
// ======================= 主程式部分 =======================
// 編碼
int code()
{
int n = 1;
for (bool item : flag)
{
if (item)
n*=4;
}
cout << "十進位制共0~" << n-1 << "位" << endl;
return n - 1;
}
// 解碼
void decode(int num)
{
for (int i = 0; i < 10; i++)
{
if (flag[i])
{
a[i] = num % 4+1;
num /= 4;
}
}
}
// 問題解決
void resolve()
{
cout << "Config Info:" << endl;
for (int k = 0; k < 10; k++)
cout <<"第"<<k+1<<"題:" << ((flag[k]==1)?"true":"false") << endl;
cout << "Are you going to continue?" << endl;
getchar();
const int H_limit = code();
int result_tmp = 0;
for (int i = 0; i <= H_limit; i++)
{
decode(i);
for (int j = 1; j < 10; j++)
{
result_tmp = pf[j](false);
if ((flag[j]) && (result_tmp != a[j]))
break;
cout << i << " 第"<<j+1<<"題:" << translate(result_tmp) << " " ;
show();
if (result_tmp != 0)
{
a[j] = result_tmp;
if (j == 9)
return;
}
else
break;
}
}
return;
}
// 翻譯
char translate(int in)
{
switch (in)
{
case 0:
return '0';
break;
case 1:
return 'A';
break;
case 2:
return 'B';
break;
case 3:
return 'C';
break;
case 4:
return 'D';
break;
default:
break;
}
return 'X';
}
// 答案顯示
void show()
{
for (int item : a)
{
cout << translate(item) << " ";
}
cout << endl;
}
// 主程式入口
int main()
{
decode(code());
resolve();
show();
getchar();
return 0;
}
執行結果
答案為:BCACA CDABA
PS: 去掉顯示後只需0.003s出結果,遍歷不可能有這麼快。(手動斜眼)