網站首頁 編程語言 正文
描述:
日本某地發生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個。
以下為4個嫌疑犯的供詞:
A說:不是我。????????
B說:是C。
C說:是D。
D說:C在胡說
已知3個人說了真話,1個人說的是假話。
現在請根據這些信息,寫一個程序來確定到底誰是兇手。
思路及分析:
? ? ? ? 從來沒有做過類似題目的同學第一次看見這道題,可能有點發懵。然后開始考慮假設,排列組合,枚舉等等...但是這道題的代碼結果會讓你大吃一驚。
? ? ? ? 首先,要考慮的是如何用代碼表示A,B,C,D這四個人說的話?我們定義一個char變量killer來表示兇手。最能想到的就是如果某個人說的話是成立的話,將他的結果為1(類似于bool類型),否則就是0。這樣的想法是正確的。A說,不是A,那么,可以表示為killer != ‘A’。判斷成立的話,他就會返回1,否則,返回0。類似的,其他3個人說的話也可以這樣來表示。最后,根據3個人說了真話,1個人說了假話得知返回的總和為3。比如,我們假設A就是兇手,那么根據四個人說的話,A說了假話,B也說了假話,和條件是不符合的。這樣之后,只是判斷了A的情況,B,C,D的情況還沒有判斷,只需要加一個循環就可以了。
????????C語言代碼如下:
#include<stdio.h> int main(void) { char killer = 'A'; for (killer = 'A'; killer <= 'D'; killer++) { if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3) { printf("the killer is %c", killer); } } return 0; }
? ? ? ? 結果如下:
現在,我們來看和它相似的第二道題目:
描述:
????????兩個乒乓球隊進行比賽,甲隊為ABC三人;乙隊為XYZ三人;抽簽決定比賽名單,有人向隊員打聽比賽的名單,A說他不和X比,C說他不和Z比。請編程輸出所有可能的對陣方案,并統計方案的個數。
思路及分析:
? ? ? ? 這道題和猜兇手那道題目的方法是一致的,都是直接把題目的文字描述轉換為代碼描述。直接使用 for循環即可。代碼如下:
#include<stdio.h> int main(void) { char A = 0; char B = 0; char C = 0; for (A = 'X'; A <= 'Z'; A++) { for (B = 'X'; B <= 'Z'; B++) { for (C = 'X'; C <= 'Z'; C++) { if ((A != 'X') + (C != 'Z') == 2) { if (A != B && B != C && C != A) { printf("A VS %c, B VS %c, C VS %c\n", A, B, C); } } } } } return 0; }
????????結果如下:
第三道題目:
描述:
5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果:
A選手說:B第二,我第三;
B選手說:我第二,E第四;
C選手說:我第一,D第二;
D選手說:C最后,我第三;
E選手說:我第四,A第一;
比賽結束后,每位選手都說對了一半,請編程確定比賽的名次。
思路及分析:
? ? ? ? 暴力破解法即可。代碼如下:
#include<stdio.h> int main(void) { int a = 0, b = 0, c = 0, d = 0, e = 0; for (a = 1; a <= 5; a++) { for (b = 1; b <= 5; b++) { for (c = 1; c <= 5; c++) { for (d = 1; d <= 5; d++) { for (e = 1; e <= 5; e++) { if (((b == 2) + (a == 3) == 1) && //B第二,我第三 ((b == 2) + (e == 4) == 1) && //我第二,E第四 ((c == 1) + (d == 2) == 1) && //我第一,D第二 ((c == 5) + (d == 3) == 1) && //C最后,我第三 ((e == 4) + (a == 1) == 1)) //我第四,A第一 { if (a * b * c * d * e == 120) { printf("%d %d %d %d %d\n", a, b, c, d, e); } } } } } } } return 0; }
總結:
最后一道題目來看,出現了驚人的五個for循環。同時,每一個for循環都是循環5次,時間復雜度達到了O(n * n)。也就是說,一旦要判斷的人數增多,計算機的計算速度將會以肉眼可見的速度慢下去。類似的題目采用暴力破解的方法雖然不是最優解,但卻是最直觀簡單,好理解的方法。?
原文鏈接:https://blog.csdn.net/Naion/article/details/121884821
- 上一篇:C++缺省參數的具體使用_C 語言
- 下一篇:C語言實現簡單的猜數字游戲_C 語言
相關推薦
- 2022-12-04 Nginx?禁止直接訪問目錄或文件的操作方法_nginx
- 2023-08-15 vite打包報錯 Rollup failed to resolve
- 2021-12-06 C語言練習之數組中素數交換_C 語言
- 2021-11-10 Android?Studio設置繪制布局時的視圖_Android
- 2022-12-10 C++?vector與數組轉換寫入/讀出文件方式_C 語言
- 2022-06-16 React實現核心Diff算法的示例代碼_React
- 2023-07-16 spring boot 實現token攔截
- 2023-05-20 Golang基于文件魔數判斷文件類型的案例代碼_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支