#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct tag_point_t
{
    double x, y;
}point_t;

#define POINT_NUM 30

double calc_distance(const point_t *p, const point_t *q)
{
	double dx, dy;

	dx=p->x-q->x;
	dy=p->y-q->y;
	return sqrt(dx*dx+dy*dy);
}

int main(void)
{
	point_t point[POINT_NUM];
	unsigned long connection[POINT_NUM], A_connection;
	int i, j, is_changed, A, B;

	for(i=0;i<POINT_NUM;i++)
	{
		point[i].x=rand()/(RAND_MAX+1.0)*10.0;
		point[i].y=rand()/(RAND_MAX+1.0)*10.0;
		connection[i]=0;
	}

	A=rand()%POINT_NUM;
	do
	{
		B=rand()%POINT_NUM;
	}while(A==B);

	for(i=0;i<POINT_NUM;i++)
	{
		for(j=i;j<POINT_NUM;j++)
		{
			if(calc_distance(&point[i], &point[j])<=10.0)
			{
				connection[i]|=(1<<j);
				connection[j]|=(1<<i);
			}
		}
	}

	A_connection=connection[A];
	do
	{
		is_changed=0;
		for(i=0;i<POINT_NUM;i++)
		{
			if(((A_connection>>i)&1) && ((A_connection&connection[i])!=connection[i]))
			{
				A_connection|=connection[i];
				is_changed=1;
			}
		}
	}while(is_changed);

	for(i=0;i<POINT_NUM;i++)
	{
		printf("%2d : (%f,%f)\n", i, point[i].x, point[i].y);
	}
	printf("A=%d  B=%d\n", A, B);

	printf("移動%s\n", ((A_connection>>B)&1)?"可能":"不可能");

	return 0;
}
