SRM 505 Div1 Easy RectangleArea

問題概要

幅W,高さHの長方形が横N本、縦M本の直線により、NM個の小長方形に分割されている。
長方形のうちいくつかの面積がが与えられる。


このとき、全体の長方形の面積を求めるのに、さらに必要な小長方形の面積の情報の個数を求めよ。

制約条件

N,M ≦ 50

方針

y行目x列目の長方形を長方形(y,x)と表す。
長方形(y0,x0),(y1,x0),(y0,x1),(y1,x1)のうち、3つの面積の情報がわかっているとき、
残り一つの面積もわかる。


逆に、ある部分の面積が、今までの情報を使ってどうやってもわからないとき、
その部分の面積の情報は知る必要がある。


したがって、全ての長方形の面積がわかるまで、
わからない部分を貪欲に知る→そこからわかる面積を全部求める
を繰り返せばよいことがわかる。

ソースコード

int h,w;
vs k;

void rec(int y,int x){
	k[y][x]='Y';
	
	rep(i,h)rep(j,w){
		int Y = (k[y][x]=='Y') + (k[y][j]=='Y') + (k[i][x]=='Y') + (k[i][j]=='Y');
		if(Y==3){
			if(k[y][j]=='N')rec(y,j);
			if(k[i][x]=='N')rec(i,x);
			if(k[i][j]=='N')rec(i,j);
		}
	}
}

class RectangleArea {
	public:
	int minimumQueries(vector <string> known) 
	{
		k=known;
		h=k.size(), w=k[0].size();
		
		rep(i,h)rep(j,w)if(k[i][j]=='Y')rec(i,j);
		
		int ans=0;
		rep(i,h)rep(j,w)if(k[i][j]=='N')rec(i,j),ans++;
		return ans;
	}
};