C語言(遞迴法構造答案全集)2018刑偵科推理試題

2021-08-28 13:30:18 字數 4428 閱讀 3174

今年早些時候,這張火遍了網路,當時就想著,這個題目用計算機來解,應該是很方便的。無奈當時工作忙,沒有時間弄。最近時間閒,就鼓搗了一下,花費幾個小時,成功執行得出答案。但上網一看,各路大神早就給出了n種解法。其中找到一篇和我一樣用暴力窮舉實現的。我的解法和他的相比,區別在:我窮舉所有答案時,是用遞迴演算法實現的。再和另一篇c語言解法作者比較,他是用進製的思想遍歷所有答案,節省的是儲存空間。而我是一開始就把答案列出來,用空間換時間;在我自己的電腦上執行,速度比他的程式快3倍左右。

思路:

1.構建乙個答案集,囊括所有答案,有4^10種,共1048576個,編號從0編到1048575。

2.將每個題目看作乙個命題,把命題的選項作為引數,定義10個判斷函式,如果選項正確,函式就返回真值。

3.從編號0開始判斷到1048576,發現乙個正確答案就將編號壓棧,最後將所有正確答案列印出來。

廢話少說上**:

#include#define bool char

#define true 1

#define false 0

struct answer;

void init_answer_set(struct answer* answer_set,int low,int high,int indexnum)

}else

printf("這是第%d個答案\n",num);

for(i=0;i<10;i++)

printf("\n");

return 1;

}bool question0(struct answer* answer_set,int num) else if (answer_set[num].index[0]<97||answer_set[num].index[0]>100)//輸入檢查

if(answer_set[num].index[0]=='a')

if(answer_set[num].index[0]=='b')

if(answer_set[num].index[0]=='c')

if(answer_set[num].index[0]=='d')

}bool question1(struct answer* answer_set,int num) else if (answer_set[num].index[1]<97||answer_set[num].index[1]>100)//輸入檢查

if(answer_set[num].index[1]=='a')

if(answer_set[num].index[1]=='b')

if(answer_set[num].index[1]=='c')

if(answer_set[num].index[1]=='d')

}bool question2(struct answer* answer_set,int num) else if (answer_set[num].index[2]<97||answer_set[num].index[2]>100)//輸入檢查

if(answer_set[num].index[2]=='a')

if(answer_set[num].index[2]=='b')

if(answer_set[num].index[2]=='c')

if(answer_set[num].index[2]=='d')

}bool question3(struct answer* answer_set,int num) else if (answer_set[num].index[3]<97||answer_set[num].index[3]>100)//輸入檢查

if(answer_set[num].index[3]=='a')

if(answer_set[num].index[3]=='b')

if(answer_set[num].index[3]=='c')

if(answer_set[num].index[3]=='d')

}bool question4(struct answer* answer_set,int num) else if (answer_set[num].index[4]<97||answer_set[num].index[4]>100)//輸入檢查

if(answer_set[num].index[4]=='a')

if(answer_set[num].index[4]=='b')

if(answer_set[num].index[4]=='c')

if(answer_set[num].index[4]=='d')

}bool question5(struct answer* answer_set,int num) else if (answer_set[num].index[5]<97||answer_set[num].index[5]>100)//輸入檢查

if(answer_set[num].index[5]=='a')

if(answer_set[num].index[5]=='b')

if(answer_set[num].index[5]=='c')

if(answer_set[num].index[5]=='d')

}bool ismin(struct answer* answer_set,int num,char option)

if (count_a=1048576||num<0) else if (answer_set[num].index[6]<97||answer_set[num].index[6]>100)//輸入檢查

if(answer_set[num].index[6]=='a')

if(answer_set[num].index[6]=='b')

if(answer_set[num].index[6]=='c')

if(answer_set[num].index[6]=='d')

}bool question7(struct answer* answer_set,int num) else if (answer_set[num].index[7]<97||answer_set[num].index[7]>100)//輸入檢查

if(answer_set[num].index[7]=='a')

if(answer_set[num].index[7]=='b')

if(answer_set[num].index[7]=='c')

if(answer_set[num].index[7]=='d')

}bool question8(struct answer* answer_set,int num) else if (answer_set[num].index[8]<97||answer_set[num].index[8]>100)//輸入檢查

if(answer_set[num].index[8]=='a')

if(answer_set[num].index[8]=='b')

if(answer_set[num].index[8]=='c')

if(answer_set[num].index[8]=='d')

}int max_minus_min(struct answer* answer_set,int num);

int indexnum;

int temp,i,j;

for (indexnum=0;indexnum<10;indexnum++)

for(i=0;i<3;i++)

}return (count[3]-count[0]);

}bool question9(struct answer* answer_set,int num) else if (answer_set[num].index[9]<97||answer_set[num].index[9]>100)//輸入檢查

if(answer_set[num].index[9]=='a')

if(answer_set[num].index[9]=='b')

if(answer_set[num].index[9]=='c')

if(answer_set[num].index[9]=='d')

} int p=0;

void push(int *array,int num)

else

printf("正確答案數量超過10個\n");

}int main();

void printf_bl(int num)

printf("\n");

} for(num=0;num<1048576;num++)

} for(i=0;i最後執行,花費0.09秒得出答案:bcacacdaba。

C語言及程式設計高階例程 6 遞迴法問題求解

賀老師教學鏈結 c語言及程式設計高階 本課講解 求n include long fact int n int main 輸入乙個正整數n,反序輸出其各位數 include void f int n int main 例 十進位制轉二進位制的遞迴演算法 include void f int n int...

C語言及程式設計高階例程 6 遞迴法問題求解

賀老師教學鏈結 c語言及程式設計高階 本課講解 求n include long fact int n int main 輸入乙個正整數n,反序輸出其各位數 include void f int n int main 例 十進位制轉二進位制的遞迴演算法 include void f int n int...

遞迴法解決回式蛇形矩陣的輸出(C語言的實現)

蛇形矩陣有多種,今天說的是下面這種回形的蛇形矩陣。如4x4的回形蛇形矩陣 如5x5的回形蛇形矩陣 通過分析發現,這種矩陣,在走一圈以後又變成乙個小2個的矩陣,如5x5的矩陣,從1 2 3。到14 15 16一圈後,變成了3x3的矩陣,因此可以使用遞迴的方式來解決這個問題。1.走一圈需要4個迴圈 1 ...