解いた問題

5/21/2012

SRM404 Div2 Medium

500

やるだけ。



// ?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;
  }
};