SRM100問解こう(4/100) SRM404 Div1 250 RevealTriangle

未だ4問目なのが大変悲しい。

適当に場合分けしてやるだけ……と思いきやハマってつらい思いをした。
確定できる箇所はforで順番に見ていくことはできない、と思ってwhile使ったけど別にそうでもなかった様子*1

class RevealTriangle {
public:
    vector<string> calcTriangle(vector<string> questionMarkTriangle) {
        vector<string> ret=questionMarkTriangle;
        int k=0;
        
        for (int i=0; i<ret.size(); i++) {
            for (int j=0; j<ret[i].size(); j++) {
                if (ret[i][j]=='?') {
                    k++;
                }
            }
        }
        
        while (k) {
            for (int i=0; i<ret.size(); i++) {
                for (int j=0; j<ret[i].size(); j++) {
                    if (ret[i][j]=='?') {
                        /*
                         ?b
                         c
                         */
                        if (i<ret.size()-1&&j<ret[i].size()-1&&
                            ret[i][j+1]!='?'&&
                            ret[i+1][j]!='?'
                            ) {
                            int b = ret[i][j+1] - '0',
                            c = ret[i+1][j] - '0';
                            
                            int a = ( c >= b ? c - b : c - b + 10);
                            
                            ret[i][j]=('0' + a);
                            
                            k--;
                        }
                        /*
                         a?
                         c
                         */
                        else if (i<ret.size()-1&&j>0&&
                                 ret[i][j-1]!='?'&&
                                 ret[i+1][j-1]!='?'
                                 ) {
                            int a = ret[i][j-1] - '0',
                            c = ret[i+1][j-1] - '0';
                            
                            int b = ( c >= a ? c - a : c - a + 10);

                            ret[i][j]=('0' + b);
                            
                            k--;
                            
                        }
                        
                        /*
                         ab
                         ?
                         */
                        else if (i>0&&j>0&&
                                 ret[i-1][j]!='?'&&
                                 ret[i-1][j+1]!='?'
                                 ) {
                            int a = ret[i-1][j]-'0',
                            b = ret[i-1][j+1]-'0';
                            
                            int c = (a + b) % 10;
                            
                            ret[i][j]=('0' + c);
                            
                            k--;
                        }
                    }
                }
            }
            
        }
        
        
        return ret;
    }
};

*1:終わった後に隣で爆速で通してた赤い人のコードを見たら、 3つ目の制約の意味と、簡単な解法が分かりました……orz