#include <iostream> #include <algorithm> #include <math.h> #define csMax 1001 using namespace std; struct LocationData { double nFrom; double nTo; }; LocationData dd[csMax]; int nCaseNum, nIslandNum; double d; double nX[csMax], nY[csMax]; int totalMin; void funInit(); void funInput(); int funIsSolution(); void funDealData(); bool cmp(const LocationData &a, const LocationData &b); void funOutput(); void funGreedy(); int main() { nCaseNum = 1; while(2 == scanf("%d %lf", &nIslandNum, &d)) { if(!nIslandNum || !d) break; else funInput(); funInit(); if(!funIsSolution()) totalMin = -1; else { funDealData(); funGreedy(); } // for(int i = 1; i <= nIslandNum; i++) // printf("%.2f %.2f/n", dd[i].nFrom, dd[i].nTo); funOutput(); } return 0; } void funInit() { totalMin = 1; } void funInput() { int i; for(i = 1; i <= nIslandNum; i++) { scanf("%lf %lf", &nX[i], &nY[i]); } } int funIsSolution() { int i; bool flag; flag = true; for(i = 1; i <= nIslandNum; i++) { if(nY[i] > d) { flag = false; break; } } return flag; } void funDealData() { int i; for(i = 1; i <= nIslandNum; i++) { dd[i].nFrom = nX[i] - sqrt(d * d - nY[i] * nY[i]); dd[i].nTo = nX[i] + sqrt(d * d - nY[i] * nY[i]); } sort(&dd[1], &dd[nIslandNum+1], cmp); } bool cmp(const LocationData &a, const LocationData &b) { return a.nFrom < b.nFrom; } void funOutput() { printf("Case %d: %d/n", nCaseNum++, totalMin); } void funGreedy() { int i; double temp = dd[1].nTo; for(i = 2; i <= nIslandNum; i++) { if(dd[i].nFrom > temp) { totalMin ++; temp = dd[i].nTo; } else if(dd[i].nTo < temp) //这里要特别注意! { temp = dd[i].nTo; } } }