SRM 504 500pt: AlgridTwo
keyword
シミュレーション C++
問題概要
次の関数Algrid2がある。
vector<string> Algrid2(vector<string> input){ int H = input.size(), W = input[0].size(); for(int i=0; i<H-1; i++)for(int j=0; j<W-1; j++){ char A = input[i][j], input[i][j+1]; if(A=='W' && B=='W'){ ; } else if(A=='B' && B=='W'){ input[i+1][j] = input[i+1][j+1] = 'B'; } else if(A=='W' && B=='B'){ input[i+1][j] = input[i+1][j+1] = 'W'; } else{ swap(input[i+1][j], input[i+1][j+1]); } } return input; }
output=Algrid2(input)となるようなinputの個数をmodで求める問題。
解法
2行目以降でシミュレーションっぽいことをしたら求められる。
class AlgridTwo { public: int makeProgram(vector <string> output) { int ret = 1; int H = output.size(), W = output[0].size(); for(int i=0; i<H-1; i++){ string t = string(W, '?'); for(int j=0; j<W-1; j++){ char A = output[i][j], B = output[i][j+1]; if(A=='B' && B=='B'){ swap(t[j],t[j+1]); } else if(A=='W' && B=='B'){ t[j] = t[j+1] = 'W'; } else if(A=='B' && B=='W'){ t[j] = t[j+1] = 'B'; } } for(int j=0; j<W; j++)if(t[j]!='?'){ if(t[j] != output[i+1][j]) return 0; else ret = (ret*2)%MOD; } } return ret%MOD; }