やるだけ。
// ?b
// c
void f(vector<string>& v, int i, int j)
{
if (i + 1 < v.size() && j + 1 < v[i].size()) ; else return ;
if (v[i][j] == '?' && v[i][j + 1] != '?' && v[i + 1][j] != '?') {
int b = v[i][j + 1] - '0';
int c = v[i + 1][j] - '0';
int a = (c - b + 10) % 10;
v[i][j] = a + '0';
}
return ;
}
// ab
// ?
void g(vector<string>& v, int i, int j)
{
if (i && j + 1 < v[i - 1].size()) ; else return ;
if (v[i][j] == '?' && v[i - 1][j] != '?' && v[i - 1][j + 1] != '?') {
int a = v[i - 1][j] - '0';
int b = v[i - 1][j + 1] - '0';
v[i][j] = (a + b) % 10 + '0';
}
return ;
}
// a?
// c
void h(vector<string>& v, int i, int j)
{
if (i + 1 < v.size() && j) ; else return ;
if (v[i][j] == '?' && v[i][j - 1] != '?' && v[i + 1][j - 1] != '?') {
int a = v[i][j - 1] - '0';
int c = v[i + 1][j - 1] - '0';
int b = (c - a + 10) % 10;
v[i][j] = b + '0';
}
return ;
}
class RevealTriangle {
public:
vector <string> calcTriangle(vector <string> T)
{
for (int loop = T.size() * T.size(); loop--; ) {
for (int i = 0; i < (int)T.size(); ++i) {
for (int j = 0; j < (int)T[i].size(); ++j) {
if (T[i][j] == '?') f(T, i, j);
if (T[i][j] == '?') g(T, i, j);
if (T[i][j] == '?') h(T, i, j);
}
}
}
return T;
}
};