PKU 2954 Triangle
http://poj.org/problem?id=2954
正の面積をもつ三角形の3点の座標が渡されるので、三角形の内部(点や辺を含まない)にある格子点の数を求めろというような問題。
x座標、またはy座標ごとに格子点の数を数えて足していく。
場合分けが面倒くさい。漏れがありまくりで結構WAりました。
PI in[3]; main(){ while(true){ bool end=false; rep(i,3){ cin>>in[i].F>>in[i].S; end|=in[i].F|in[i].S; } if(!end)break; sort(in,in+3); int ans=0; for(int i=in[0].F+1;i<in[2].F;++i){ double y1,y2; if(i<in[1].F){ y1=((double)i-in[0].F)*(in[1].S-in[0].S)/(in[1].F-in[0].F)+in[0].S; y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S; if(y1<y2){ y1=ceil(y1+EPS); y2=floor(y2-EPS); ans+=abs(y2-y1+1)+EPS; }else{ y1=floor(y1-EPS); y2=ceil(y2+EPS); ans+=abs(y1-y2+1)+EPS; } }else if(i==in[1].F){ y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S; y1=in[1].S; if(y1<y2){ y1=ceil(y1+EPS); y2=floor(y2-EPS); ans+=abs(y2-y1+1)+EPS; }else{ y1=floor(y1-EPS); y2=ceil(y2+EPS); ans+=abs(y1-y2+1)+EPS; } }else{ y1=((double)i-in[2].F)*(in[1].S-in[2].S)/(in[1].F-in[2].F)+in[2].S; y2=((double)i-in[0].F)*(in[2].S-in[0].S)/(in[2].F-in[0].F)+in[0].S; if(y1<y2){ y1=ceil(y1+EPS); y2=floor(y2-EPS); ans+=abs(y2-y1+1)+EPS; }else{ y1=floor(y1-EPS); y2=ceil(y2+EPS); ans+=abs(y1-y2+1)+EPS; } } } cout<<ans<<endl; } }
追記:他の人の解答を見てみると、ピックの定理なるものを使って大分スマートに解けるみたいですね。