질문인 숫자와 스트라이크, 볼을 입력받아 가능한 숫자의 총 개수를 구하는 문제이다.
질문을 입력받을 때마다 가능한 세자리 숫자를 표시하고, 마지막에 표시된 숫자를 세면 된다. 가능한 세자리는 900개보다 적고 질문의 수도 100개 이하이므로 완전 탐색으로 구현하면 된다. 구현이 귀찮다.
#include <iostream>
#include <vector>
using namespace std;
int N;
vector<bool> isAns(1000, true);
bool check(int possibleNum, int n, int s, int b) {
int strike = 0, ball = 0;
int pNum[3], inNum[3];
for (int i = 0; i < 3; ++i) {
pNum[i] = possibleNum % 10;
possibleNum /= 10;
}
for (int i = 0; i < 3; ++i) {
inNum[i] = n % 10;
n /= 10;
}
if (pNum[0] == 0 || pNum[1] == 0 || pNum[2] == 0)
return false;
if (pNum[0] == pNum[1] || pNum[0] == pNum[2] || pNum[1] == pNum[2])
return false;
if (inNum[0] == 0 || inNum[1] == 0 || inNum[2] == 0)
return false;
if (inNum[0] == inNum[1] || inNum[0] == inNum[2] || inNum[1] == inNum[2])
return false;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (pNum[i] == inNum[j]) {
if (i == j) ++strike;
else ++ball;
}
}
}
if (s == strike && b == ball) return true;
return false;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> N;
while (N--) {
int n, s, b;
cin >> n >> s >> b;
for (int i = 100; i < 1000; ++i)
if (isAns[i] && !check(i, n, s, b))
isAns[i] = false;
}
int ret = 0;
for (int i = 100; i < 1000; ++i)
if (isAns[i]) ++ret;
cout << ret;
return 0;
}