TopCoder SRM 530 Div2 Medium
問題
nxmのグリッドであらわされるケーキがある。
このケーキを、hxlのグリッドであらわされるカッターで切る。
カッターはケーキのグリッドに合うように使い、カッターはケーキの外にはみ出てはならない。
更に、カッターの'.'のマスにはケーキがなくてはならない。
カッターでケーキを切った後は、カッターの'.'のマスの下のケーキはなくなる。
カッターを何回か使った後のケーキの様子が与えられる。
'X'のマスはケーキがあり、'.'のマスは空白のマスである。
この様子は、カッターを上の条件に合うように正しく使っているか。
そうならYESを、そうでないならNOを出力せよ。
制約条件
n,m≦50
h,l≦50
方針
左上から順にカッターを使えたのなら、使ったことにしていく。
最も左上でカッターを使えた場合、使わなかったことにするメリットはないので、使ったことにしていっていい。
最後まで終わったとき、ケーキ全体が復元していたらYES.
そうでないならNO.
ソースコード
class GogoXCake { public: string solve(vector <string> cake, vector <string> cutter) { int H=cake.size(), W=cake[0].size(); int h=cutter.size(), w=cutter[0].size(); for(;;){ bool update=0; rep(i,H-h+1)rep(j,W-w+1){ rep(k,h)rep(l,w)if(cutter[k][l]=='.'&&cake[i+k][j+l]!='.')goto FAIL; rep(k,h)rep(l,w)if(cutter[k][l]=='.')cake[i+k][j+l]='X'; update=1; //rep(k,H)cerr<<cake[k]<<endl; FAIL:; } if(!update)break; } rep(i,H)rep(j,W)if(cake[i][j]!='X')return "NO"; return "YES"; } };