- 2次元の世界に鏡があって自分が立ってるので自分がいくつ見えるかを求める問題。
- 難しそうなので部屋の壁にしか鏡がない small を考える
- 反射するイコール対称な位置に自分がいるということなので鏡の向こうの自分をたくさん配置する
- 各自分について、実際の自分の位置から見えるかどうか判定する。
- 距離が近いほうから見ていって、同一直線上にあったらカウントしない
- サンプルの 3x4 の部屋で 68 人も見える事にびっくり。実際のところは頭の幅とかあるからそんなに見えないかもしれないけど見てみたら怖そう...
- small 通ったけど large わからん。解説をみる
int main() {
int test_cases;
cin>>test_cases;
REP(ttt, test_cases) {
int H,W,D;
cin>>H>>W>>D;
int ox=0, oy=0;
REP(h, H) {
string s;
cin>>s;
REP(i, s.size()) if(s[i]=='X') {ox=i; oy=h;}
}
ox--;oy--;
int ww = 100/(W-2)+1;
int hh = 100/(H-2)+1;
int ans = 0;
vector<pair<int, PII> > l;
for(int x=-ww;x<=ww;x++) {
for(int y=-hh;y<=hh;y++) {
int MX = x*(W-2)+(x%2==0 ? ox : W-2-ox-1)-ox;
int MY = y*(H-2)+(y%2==0 ? oy : H-2-oy-1)-oy;
int d = MX*MX+MY*MY;
if(d!=0 && d<=D*D) l.PB(MP(d, MP(MX, MY)));
}
}
sort(ALL(l));
vector<PII> used;
REP(i, l.size()) {
int d = l[i].first;
int MX=l[i].second.first;
int MY=l[i].second.second;
int ok=1;
REP(j, used.size()) {
int ux = used[j].first;
int uy = used[j].second;
if(MX*ux<0) continue;
if(MY*uy<0) continue;
if(ux==0) {
if(MX!=0) continue;
else {ok=0;break;}
}
if(uy==0) {
if(MY!=0) continue;
else {ok=0;break;}
}
int ug = GCD(ux, uy);
int mg = GCD(MX, MY);
if(ux/ug==MX/mg && uy/ug==MY/mg) {ok=0;break;}
}
if(ok) {
ans++;
used.PB(l[i].second);
}
}
cout<<"Case #"<<ttt+1<<": "<<ans<<endl;
}
return 0;
}