You are on page 1of 7

#include<stdlib.

h>
#include<stdio.h>
#include<math.h>
#define PI
#define R3

3.14159265
1.73205080

typedef struct sensor


{
int id, VP[6], G[6], slave_count, vp_count;
int pt[1][2];
char status;
int S[1000], L[1000];
float o_pt[1][2];
}sensor;
void neighbor_discovery(sensor, int, sensor x[]);
void snap(int, int, int, int, sensor x[]);
int s_push(int, int, int, sensor n[]);
int req(int, int, int, sensor n[]);
int mov_cond(int, int, sensor);
int solve(int);
int t, no_lev=0, msg_count=0, count=0;
int main()
{
FILE *fp, *ff;
fp=fopen("output.txt","w");
ff=fopen("coordinates.txt","w");
int n,s_init=0,x1,y1,x2,y2,pt_deploy[1][2];
int i,j,k,l,m,p=0,incr=0,r,s;
printf("\nEnter the number of sensors : ");
scanf("%d", &n);
sensor node[n];
printf("\nEnter x1, x2, y1, y2 : ");
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
pt_deploy[0][0] = (x1+x2)/2;
pt_deploy[0][1] = (y1+y2)/2;
for(i=0;i<n;i++)
{
node[i].id = i;
node[i].pt[0][0] = pt_deploy[0][0];
node[i].pt[0][1] = pt_deploy[0][1];

node[i].o_pt[0][0] = pt_deploy[0][1];
node[i].o_pt[0][1] = pt_deploy[0][1];
node[i].status = 'f';
node[i].slave_count = 0;
node[i].vp_count = 6;
l=0;
for(k=0;k<6;k++)
{
node[i].G[k] = -1;
node[i].VP[k] = l++;
}
}
for(i=0; i<n; i++)
{
j=0;
for (k=0;k<n;k++)
{
if ((node[i].pt[0][0]+2>node[j].pt[0][0])
&&(node[i].pt[0][1]+2>node[j].pt[0][1])&&(node[i].id != node[j].id))
{
node[i].L[k] = node[j].id;
}
else
node[i].L[k] = -1;
j++;
node[i].S[k] = -1;
}
}
i=0;
while(i<n)
{
if (node[i].id == s_init)
{
node[i].status = 'S';
break;
}
i++;
}
neighbor_discovery(node[i], n, node);
j=0;
for(k=0;k<n;k++)
{
if(node[s_init].VP[j] != -1)
{
if (node[s_init].L[k] != -1)
{

snap(s_init, j, node[s_init].L[k], n, node);


j++;
}
}
if (j==6)
break;
}
for(l=1;l<n;l++)
{
for(i=0;i<node[l].vp_count;i++)
{
neighbor_discovery(node[l],n,node);
j=0;
while(j<6)
{
p=node[l].G[j];
if(p!=-1)
{
t=node[l].id;
k = req(p, node[l].id, n ,node);
if(k==1)
{
for(j=0;j<n;j++)
if (node[l].S[j] != -1)
break;
for(m=0;m<6;m++)
if (node[l].VP[m] != -1)
break;
if ((node[l].vp_count > 0)&&(j!=n))
snap(node[l].id, node[l].VP[m], node[l].S[j], n, node );
}
break;
}
else
j++;
}
}
}
no_lev = solve(n);
k = no_lev-1;
if ((k==1)||(n==1))
msg_count = 0;
else
{
for(i=2;i<k;i++)
msg_count += (2*pow(i,2)*(i*6));
msg_count += 24;

s=0;
for(i=k;i>0;i--)
s += (i*6);
s+=1;
if (s==n)
msg_count += (2*pow(k,2)*(k*6));
else
{
j=0;
j = (k*6)-(s-n);
msg_count += (2*pow(k,2)*j);
}
}
for(j=0;j<n;j++)
neighbor_discovery(node[j],n,node);
fprintf(ff,"X =");
for(j=0;j<n;j++)
fprintf(ff,"
%f", node[j].o_pt[0][0]);
fprintf(ff,"\n\nY =");
for(j=0;j<n;j++)
fprintf(ff,"
%f", node[j].o_pt[0][1]);
fprintf(fp,"\n\tThere are %d levels for %d sensors.\n", no_lev, n);
fprintf(fp,"\n\tNumber of messages passed is %d.\n", msg_count);
fclose(fp);
fclose(ff);
return 0;
}
int req(int parent, int child, int n, sensor node[n])
{
int p,j=0,x;
if(mov_cond(child, node[child].slave_count, node[parent]))
{
x = s_push(parent, child, n, node);
if(t==x)
return 1;
else
{
j=0;
while(j<6)
{
p = node[t].G[j];
if(p==-1)
j++;
else
break;
}

if (p!=-1)
return (req(p, t, n, node));
}
}
else
{
j=0;
while(j<6)
{
p = node[parent].G[j];
if(p==-1)
j++;
else
break;
}
if (p!=-1)
return (req(p, parent, n, node));
}
}
void neighbor_discovery (sensor s, int n, sensor node[n])
{
int i,j,k=0,l=0;
for(i=0;i<n;i++)
{
if((node[i].pt[0][0]<s.pt[0][0]+2)&&(node[i].pt[0][1]<s.pt[0][1]+2)
&&(node[i].id!=s.id)&&(node[i].status!='S')&&(node[i].status!='s'))
{
node[s.id].S[k] = node[i].id;
node[s.id].slave_count++;
node[i].status ='s';
k++;
}
if((node[i].pt[0][0]<=s.pt[0][0]+2)&&(node[i].pt[0][1]<=s.pt[0][1]+1)
&&(node[i].id!=s.id)&&(node[i].status=='S')&&(node[i].pt[0][0]>=s.pt[0][0]-2)
&&(node[i].pt[0][1]>=s.pt[0][1]-1)&&(s.status=='S'))
{
node[s.id].G[l] = node[i].id;
l++;
}
if ((node[i].id != s.id) && (node[i].status == 'S') && (s.vp_count > 0)
&& (s.vp_count < 7) && (s.status == 'S'))
{
if((node[i].pt[0][0] == s.pt[0][0]+2 && node[i].pt[0][1] == s.pt[0][1])
&&(node[s.id].VP[0]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[0]=-1;

}
if((node[i].pt[0][0] == s.pt[0][0]+1
&&(node[s.id].VP[1]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[1]=-1;
}
if((node[i].pt[0][0] == s.pt[0][0]-1
&&(node[s.id].VP[2]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[2]=-1;
}
if((node[i].pt[0][0] == s.pt[0][0]-2
&&(node[s.id].VP[3]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[3]=-1;
}
if((node[i].pt[0][0] == s.pt[0][0]-1
&&(node[s.id].VP[4]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[4]=-1;
}
if((node[i].pt[0][0] == s.pt[0][0]+1
&&(node[s.id].VP[5]!=-1))
{
node[s.id].vp_count--;
node[s.id].VP[5]=-1;
}

&& node[i].pt[0][1] == s.pt[0][1]+1)

&& node[i].pt[0][1] == s.pt[0][1]+1)

&& node[i].pt[0][1] == s.pt[0][1])

&& node[i].pt[0][1] == s.pt[0][1]-1)

&& node[i].pt[0][1] == s.pt[0][1]-1)

}
}
}
void snap(int s, int j, int i, int n, sensor node[n])
{
int k;
if (node[i].status == 's')
{
node[i].pt[0][0] = round(node[s].pt[0][0] + (R3
node[i].pt[0][1] = round(node[s].pt[0][1] + (R3
node[i].o_pt[0][0] = node[s].o_pt[0][0] + (R3 *
node[i].o_pt[0][1] = node[s].o_pt[0][1] + (R3 *
node[i].status = 'S';
for (k=0; k<n; k++)
{
if(node[s].S[k] == node[i].id)

* cos(j*(PI/3))));
* sin(j*(PI/3))));
cos(j*(PI/3)));
sin(j*(PI/3)));

{
node[s].S[k] = -1;
node[s].slave_count--;
}
}
}
}
int mov_cond(int id_y, int Sy, sensor x)
{
if((x.status=='S') && (x.slave_count>0))
return 1;
else
return 0;
}
int s_push(int s, int id_y, int n, sensor node[n])
{
int i,k;
k = node[id_y].slave_count;
for(i=0;i<n;i++)
if (node[s].S[i] != -1)
break;
if(node[node[s].S[i]].status == 's')
{
node[node[s].S[i]].pt[0][0] = node[id_y].pt[0][0];
node[node[s].S[i]].pt[0][1] = node[id_y].pt[0][1];
node[id_y].slave_count++;
node[id_y].S[k] = node[s].S[i];
node[s].S[i] = -1;
node[s].slave_count--;
}
return (node[id_y].id);
}
int solve(int n)
{
int x=1,i=1,count=0;
while(x<n)
{
x=x+(6*i);
if (x<=n)
count++;
i++;
}
return (count);
}

You might also like