3자리 수로 친구랑 숫자 야구를 한당
물어보는 숫자와 몇 스트라이크, 몇 볼 인지 정보들이 주어질 때
가능한 답의 총 개수는?
다른 사람들은 123~987 까지의 수들 중 말이 되는 수를 찾거나
말이 안 되는 수를 지우는 방법으로 많이들 풀던데
나는 가능한 상태를 저장하면서 탐색하는 BFS/DFS를 최근에 너무 많이 풀었더니ㅋㅋㅋ
가능한 숫자 상태들을 일일이 만들면서 check배열에 표시해줬다
(뭔가 스트라이크랑 볼 정보가 있으면
생각보다는 가능한 숫자 상태들이 별로 없을 것 같아서 이렇게 구현해 봤는데
내가 노가다를 해서 조금 만들든, 그냥 숫자들 돌아가면서 되는지 안 되는지 보든,
for문 3번 도는건 똑같아서 그런지 시간은 비슷한 것 같다 그냥 노다가였던걸로ㅋㅋ
코드는 아까워서 올려야징)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
int testcasenum;
vector<pair<int, pair<int, int>>> testcase;
int check[1000];
void solve(int index) {
int n3 = testcase[index].first % 10;
int n2 = (testcase[index].first % 100) / 10;
int n1 = testcase[index].first / 100;
int ns = testcase[index].second.first;
int nb = testcase[index].second.second;
if (ns > 0) {
if (ns == 3) {
return;
}
else if (ns == 2) {
for (int i = 1; i < 10; i++) {
if (i != n1 && i != n2 && i != n3) {
check[n1 * 100 + n2 * 10 + i]++;
check[n1 * 100 + i * 10 + n3]++;
check[i * 100 + n2 * 10 + n3]++;
}
}
}
else {
if (nb > 0) {
if (nb == 2) {
check[n1 * 100 + n3 * 10 + n2]++;
check[n2 * 100 + n1 * 10 + n3]++;
check[n3 * 100 + n2 * 10 + n1]++;
}
else {
for (int i = 1; i < 10; i++) {
if (i != n1 && i != n2 && i != n3) {
check[n1 * 100 + n3 * 10 + i]++;
check[n1 * 100 + i * 10 + n2]++;
check[i * 100 + n2 * 10 + n1]++;
check[n3 * 100 + n2 * 10 + i]++;
check[n2 * 100 + i * 10 + n3]++;
check[i * 100 + n1 * 10 + n3]++;
}
}
}
}
else {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
if (i != j) {
if (i != n1 && i != n2 && i != n3) {
if (j != n1 && j != n2 && j != n3) {
check[n1 * 100 + i * 10 + j]++;
check[i * 100 + n2 * 10 + j]++;
check[i * 100 + j * 10 + n3]++;
}
}
}
}
}
}
}
}
else {
if (nb > 0) {
if (nb == 3) {
check[n2 * 100 + n3 * 10 + n1]++;
check[n3 * 100 + n1 * 10 + n2]++;
}
else if (nb == 2) {
for (int i = 1; i < 10; i++) {
if (i != n1 && i != n2 && i != n3) {
check[i * 100 + n3 * 10 + n2]++;
check[n3 * 100 + i * 10 + n2]++;
check[n2 * 100 + n3 * 10 + i]++;
check[i * 100 + n3 * 10 + n1]++;
check[n3 * 100 + i * 10 + n1]++;
check[n3 * 100 + n1 * 10 + i]++;
check[i * 100 + n1 * 10 + n2]++;
check[n2 * 100 + i * 10 + n1]++;
check[n2 * 100 + n1 * 10 + i]++;
}
}
}
else {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
if (i != j) {
if (i != n1 && i != n2 && i != n3) {
if (j != n1 && j != n2 && j != n3) {
check[i * 100 + n1 * 10 + j]++;
check[i * 100 + j * 10 + n1]++;
check[i * 100 + n3 * 10 + j]++;
check[n3 * 100 + i * 10 + j]++;
check[i * 100 + j * 10 + n2]++;
check[n2 * 100 + i * 10 + j]++;
}
}
}
}
}
}
}
else {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
for (int k = 1; k < 10; k++) {
if (i != j && j != k && k != i) {
if (i != n1 && i != n2 && i != n3) {
if (j != n1 && j != n2 && j != n3) {
if (k != n1 && k != n2 && k != n3) {
check[i * 100 + j * 10 + k]++;
}
}
}
}
}
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
bool flag = false;
cin >> testcasenum;
for (int i = 0; i < testcasenum; i++) {
int tempnum, s, b;
cin >> tempnum >> s >> b;
if (s == 3) {
flag = true;
}
testcase.push_back(make_pair(tempnum, make_pair(s, b)));
}
if (flag) {
cout << 1;
}
else {
for (int i = 0; i < testcasenum; i++) {
solve(i);
}
int result = 0;
for (int i = 0; i < 1000; i++) {
if (check[i] == testcasenum) {
result++;
}
}
cout << result;
}
return 0;
}