比赛的时候没有做出来,没有想到解法啊,,回来之后。侯哥提醒一下。明白了。。Orz。。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int n,d;
const int N = 159;
struct cpoint{
int x,y;
void get()
{
scanf("%d%d",&x,&y);
}
} re[N];
int getdis(int i,int j)
{
int t = (re[i].x-re[j].x)*(re[i].x-re[j].x)+(re[i].y-re[j].y)*(re[i].y-re[j].y);
int k = (int)(sqrt(t*1.0));
if(k*k==t) return k;
return k+1;
}
int dis[N][N];
bool ans[N];
queue<int> que;
bool v[N];
bool ok()
{
memset(v,0,sizeof(v));
while(!que.empty()) que.pop();
que.push(0);
v[0] = true;
while(!que.empty())
{
int e = que.front();que.pop();
for(int i=1;i<n;i++)
if(!v[i]&&ans[i]&&dis[e][i]<=d)
{
v[i] =true;
que.push(i);
}else if(!v[i]&&dis[e][i]<=(d>>1))
{
v[i] = true;
//que.push(i);
}
}
for(int i=0;i<n;i++)
if(!v[i]) return false;
return true;
}
void solve()
{
memset(ans,true,sizeof(ans));
if(!ok())
{
printf("-1\n"); return ;
}
for(int i=n-1;i>0;i--)
{
ans[i] = 0;
if(!ok())
{
ans[i] = 1;
}
}
int tmp[N],cnt=0,f=0;
for(int i=n-1;i>=0;i--)
{
if(ans[i]) tmp[cnt++] = 1,f=1;
else if(f) tmp[cnt++] = 0;
}
for(int i=0;i<cnt;i++)
printf("%d",tmp[i]);
printf("\n");
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&d))
{
for(int i=0;i<n;i++) re[i].get();
for(int i=0;i<n;i++)
{
dis[i][i] = 0;
for(int j=i+1;j<n;j++)
dis[i][j] = dis[j][i] = getdis(i,j);
}
solve();
}
return 0;
}