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";
	}
};