Pesquisei no Google "código 20q" e encontrei o seguinte: http://mosaic.cnfolio.com/B142LCW2008A197
Esta versão é apenas para animais, mas as 20 perguntas reais provavelmente têm um algoritmo semelhante.
Aqui está uma rápida visão geral do código que vinculei:
Existem várias respostas diferentes codificadas no programa. Vários atributos VERDADEIRO ou FALSO são atribuídos a eles:
#define ANIMALS_LIST "daddylonglegs bee penguin eagle giraffe octopus tiger elephant jellyfish bull \nparrot dolphin python crocodile cat leopard monkey zebra sheep rat \nowl spider frog polarbear snail tortoise rabbit salmon rhino fox"
#define MAMMALS "0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1"
#define FLYING_ANIMALS "1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
#define WATER_ANIMALS "0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0"
#define BEAK "0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0"
...
Como você pode ver, uma abelha não é um mamífero, mas voa etc.
Há uma matriz para cada grupo:
int mammals[ TOTAL_ANIMALS ] = { 0 };
int flying_animals[ TOTAL_ANIMALS ] = { 0 };
int water_animals[ TOTAL_ANIMALS ] = { 0 };
...
Quando cada pergunta é feita:
askUserQuestion( guesses, "\nQuestion %d: Is your animal a mammal? \n", mammals );
O programa analisa a definição da categoria apropriada e rastreia qual animal é mais provável aquele em que você está pensando, com base nos valores VERDADEIRO ou FALSO e na resposta Sim ou Não inserida à pergunta.
Isso é feito em:
void askUserQuestion( int guessNumber, char* question, int* animalData );