#include "puzutl.h"
int kai[8] = { 1, 0, 1, 0, 1, 0, 1, 0}; // A〜Hの人がなんと答えたか 1:はい, 0:いいえ
void getsamenum( int samenum[], int man[], int k)
{
int right = 0, left = 0;
// まず左右の正直者の数を求める
for( int i=0; i< 8; i++) {
if( i< k && man[i]) right++;
if( i> k && man[i]) left++;
}
samenum[k] = (left == right)?1:0; // 左右の正直者の数は同数か?
}
void check( int i)
{
// インデックスは [0]:A, [1]:B, [2]:C, [3]:D, [4]:E, [5]:F, [6]:G, [7]:H とみなす
int man[8]; // 正直者かどうか?
int samenum[8]; // 左右同数?
int res[8]; // どう答える(1:はい,0:いいえ)
int b = 1;
for( int k=0; k< 8; k++) {
man[k] = i & b; // ビット状態から正直者か判断する
b <<= 1;
}
for( k=0; k< 8; k++) {
getsamenum( samenum, man, k); // それぞれの人の位置で正直者,嘘つきが同数か?
}
for( k=0; k< 8; k++) {
if( man[k]) res[k] = samenum[k]?1:0; // 正直者は正直に答え
else res[k] = samenum[k]?0:1; // 嘘つきは逆に答える
}
for( k=0; k< 8; k++) {
if( res[k] != kai[k]) return; // それが問題と一致するか?
}
// Find
for( k=0; k< 8; k++) {
ps( "%c:%s ", 'A'+k, man[k]?"正直者":"嘘つき");
}
}
int main( int argc, cstring argv[])
{
for( int i=0; i< 256; i++) {
check( i); // 8ビットの各ビットが1:正直者,0:嘘つきとみなし問題と矛盾が無いか調べる
}
return 0;
}