#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const char* race[] = {"norge", "english", "dutch", "german", "swiss"};
const char* color[] = {"white", "yellow", "green", "red", "blue"};
const char* drink[] = {"water", "coffee", "milk", "beer", "tea"};
const char* pet[] = {"cat", "horse", "bird", "fish", "dog"};
const char* smoke[] = {"dunhil", "marlboro", "pallmall", "morris", "rothmans"};
bool check (vector<vector<int>>& solve, int fill) {
for (int i = 0; i < 5; ++i) {
switch (fill) {
case 4:
/* 5 */ if (solve[4][i] == 4) if ((i > 0 && solve[3][i-1] == 0) || (i < 4 && solve[3][i+1] == 0)) /* empty */; else return false;
/* 6 */ if (solve[1][i] == 1 && solve[4][i] != 0) return false;
/* 7 */ if (solve[0][i] == 3 && solve[4][i] != 1) return false;
/* 9 */ if (solve[2][i] == 0) if ((i > 0 && solve[4][i-1] == 4) || (i < 4 && solve[4][i+1] == 4)) /* empty */; else return false;
/* 10 */ if (solve[4][i] == 2 && solve[3][i] != 2) return false;
/* 14 */ if (solve[4][i] == 3 && solve[2][i] != 3) return false;
break;
case 3:
/* 13 */ if (solve[3][i] == 1 && solve[1][i] != 4) return false;
/* 11 */ if (solve[0][i] == 4 && solve[3][i] != 4) return false;
break;
case 2:
/* 4 */ if (solve[0][i] == 2 && solve[2][i] != 4) return false;
/* 8 */ if (i == 2 && solve[2][i] != 2) return false;
/* 15 */ if (solve[1][i] == 2 && solve[2][i] != 1) return false;
break;
case 1:
/* 2 */ if (solve[0][i] == 1 && solve[1][i] != 3) return false;
/* 3a */ if (solve[1][i] == 2 && i < 4 && solve[1][i+1] != 0) return false;
/* 3b */ if (solve[1][i] == 2 && i == 4) return false;
/* 12 */ if (solve[0][i] == 0) if ((i > 0 && solve[1][i-1] == 4) || (i < 4 && solve[1][i+1] == 4)) /* empty */; else return false;
break;
case 0:
/* 1 */ if (solve[0][i] == 0 && i != 0) return false;
}
}
return true;
}
void recurse(vector<int>& tmp, vector<vector<int>>& solve, int it) {
if (it == 5) {
for (int i = 0; i < 5; ++i) {
cout << i + 1 << " " << race[solve[0][i]] << " " << color[solve[1][i]] << " ";
cout << drink[solve[2][i]] << " " << pet[solve[3][i]] << " " << smoke[solve[4][i]] << " " << endl;
} cout << endl;
} else {
solve[it] = tmp;
do {
if (!check(solve, it)) continue;
recurse(tmp, solve, it + 1);
} while(next_permutation(solve[it].begin(), solve[it].end()));
}
}
int main () {
vector<vector<int>> solve(6);
vector<int> tmp(5);
for (int i = 0; i < 5; ++i) tmp[i] = i;
recurse(tmp, solve, 0);
system("pause");
}