L1-071 前世檔案 (20分)
阿新 • • 發佈:2020-12-11
技術標籤:C語言
L1-071 前世檔案 (20分)
題目描述
L1-071 前世檔案 (20分)
網路世界中時常會遇到這類滑稽的算命小程式,實現原理很簡單,隨便設計幾個問題,根據玩家對每個問題的回答選擇一條判斷樹中的路徑(如下圖所示),結論就是路徑終點對應的那個結點。
現在我們把結論從左到右順序編號,編號從 1 開始。這裡假設回答都是簡單的“是”或“否”,又假設回答“是”對應向左的路徑,回答“否”對應向右的路徑。給定玩家的一系列回答,請你返回其得到的結論的編號。
樣例輸入
3 4
yny
nyy
nyn
yyn
樣例輸出
3
5
6
2
/*
有題目可知,最小值為1,即結論1,最大值是結論2^N
當為y的時候,表示是左子樹,因此,原有值不需要改動
當為n時,表示在右子樹,此時需要在原有值的基礎上 加上 當前結點所有的葉節點的一半
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
char str[35];
int N,M;
int main()
{
scanf("%d %d",&N,&M);
int k = pow(2,N); // 計算出最大結論值
int index,n;
for(int i=0;i<M;i++){
index = 1; // 每次迴圈,都要將結論值賦值為1
n = k; // 修改當前結點所擁有的葉節點,這個時候是根節點,所以置為 k
scanf ("%s",str);
for(int j=0;j<strlen(str);j++){ // 遍歷輸入的字串
if(str[j]=='n'){ // 若為 n ,則表示需要加上當前結點所擁有的葉節點個數的一半
index += (n/2);
}
n /= 2; // 每次迴圈,葉節點的數量都會減半
}
printf("%d\n",index); // 輸出結果即可
}
return 0;
}