1. 程式人生 > >C++解2018刑偵科推理卷(閒的DT系列)

C++解2018刑偵科推理卷(閒的DT系列)

刑偵推理卷的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出結果,遍歷不可能有這麼快。(手動斜眼)
這裡寫圖片描述