//主要问题在getcar_single函数里,建立链表只建立两组就报错了,有没有大神知道咋回事
#include<stdio.h>
#include<stdlib.h>
#define ROW 30//行
#define COL 40//列
#define ROWS 10//小矩阵行
#define NUM (ROW/ROWS) //小矩阵循环次数
int *getbuf(int *p,int a);
int *getchangdiwh(int *p);
int getchangdih(int *p);
void getcar_single(int *pt,int *a,int c,int d);
int getthing(struct center *pp,int i);
struct center
{
int thing;
int x;
int y;
struct center *next;
};
int main()
{
int buf_img[ROW*COL]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int i;
int buf_w[2]={0};
int h;
int *p=NULL,*pt=NULL,*a=NULL;
p=&buf_img[0];
for(i=0;i<NUM;i++)
{
//*(a+0)为场地左边界
//*(a+1)为场地右边界
//*(a+2)为场地上边界
//h为场地下边界
pt=getbuf(p,i);
if(i==0)
{
a=getchangdiwh(pt);
getcar_single(pt,a,i,0);
}
else if(i==NUM-1)
{
h=getchangdih(pt);
//+ROWS*i;
//printf("h=%d\n",h);
getcar_single(pt,a,i,h);
}
else
{
getcar_single(pt,a,i,0);
}
}
printf("w1=%d,w2=%d,h1=%d,h2=%d\n",*(a+0),*(a+1),*(a+2),h);
}
int *getbuf(int *p,int a)
{
static int buf[ROWS][COL]={0};//要处理 的小矩阵
int i;
int *pt=NULL;
for(i=0;i<ROWS*COL;i++)
{
buf[i/COL][i%COL]=*(p+i+a*ROWS*COL);
}
pt=&buf[0][0];
return pt;
}
int *getchangdiwh(int *p)
{
static int buf_wh[3];
int i,j,a=0,b=0,c=0;
int *pt=NULL;
pt=&buf_wh[0];
for( i=0;i<ROWS;i++)
{
for( j=0;j<COL;j++)
{
if(j>0)
{
if(*(p+(j+COL*i))-*(p+(j+COL*i-1))<0&&j<COL/5)
{
a=j;
}
if(*(p+(j+COL*i))-*(p+(j+COL*i-1))>0&&j>(COL/5)*4)
{
b=j;
}
if(b-a>COL*0.858&&c==0)
{
buf_wh[0]=a;
buf_wh[1]=b-1;
buf_wh[2]=i;
c++;
}
}
}
}
// printf("%d,%d\n%d\n",buf_wh[0],buf_wh[1],buf_wh[2]);
return pt;
}
int getchangdih(int *p)
{
int i,j,a=0,b=0,c=0,d=0;
for( i=0;i<ROWS;i++)
{
for( j=0;j<COL;j++)
{
if(j>0)
{
if(*(p+(j+COL*i))-*(p+(j+COL*i-1))<0&&j<COL/5)
{
a=j;
}
if(*(p+(j+COL*i))-*(p+(j+COL*i-1))>0&&j>(COL/5)*4&&*(p+j+COL*i-4)==0)
{
b=j;
}
if(b-a>COL*0.858&&c==0)
{
d=i;
c++;
}
}
}
}
//printf("%d\n",d);
return d;
}
void getcar_single(int *pt,int *wh,int c,int d)
{
int i,j,a,b,m,n;
int bufw[30];
int bufh[30];
struct center *head,*p1,*h;
int car=0,single1=0,single2=0,single3=0,single4=0,single5=0;
int car_sumw=0,car_sumh=0,single1_sumw=0,single1_sumh=0,single2_sumw=0,single2_sumh=0,single3_sumw=0,single3_sumh=0,single4_sumw=0,single4_sumh=0,single5_sumw=0,single5_sumh=0;
int car_avgw=0,car_avgh=0,single1_avgw=0,single1_avgh=0,single2_avgw=0,single2_avgh=0,single3_avgw=0,single3_avgh=0,single4_avgw=0,single4_avgh=0,single5_avgw=0,single5_avgh=0;
head=(struct center*)malloc(sizeof(struct center));
head->next=NULL;
p1=(struct center*)malloc(sizeof(struct center));
p1->next=NULL;
for(i=0;i<ROWS;i++)
{
for(j=0;j<COL;j++)
{
if(c==0)
{
if(i>(*(wh+2)+3)&&j>(*(wh+0)+3)&&j<(*(wh+1)-3))
{
if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
{
a=0;
b=0;
do
{
bufw[a]=j+a;
bufh[a]=i;
++a;
}while(*(pt+(j+COL*i+a))==0);
if(a>3)
{
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
{
//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
{
//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else
{
for(m=0;m<a;m++)
b=b+bufw[m];
n=getthing(h->next,i);//区分信标
p1->thing=n;
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
}
}
}
else if(c==NUM-1)
{
if(i<d-3&&j>(*(wh+0)+3)&&j<(*(wh+1)-3))
{
if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
{
a=0;
b=0;
do
{
bufw[a]=j+a;
bufh[a]=i;
++a;
}while(*(pt+(j+COL*i+a))==0);
if(a>3)
{
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
{
//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
{
//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else
{
for(m=0;m<a;m++)
b=b+bufw[m];
n=getthing(h->next,i);//区分信标
p1->thing=n;
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
}
}
}
else
{
if(j>(*(wh+0)+3)&&j<(*(wh+1)-3))
{
if(*(pt+(j+COL*i))-*(pt+(j+COL*i)-1)<0)//场地里面
{
a=0;
b=0;
do
{
bufw[a]=j+a;
bufh[a]=i;
++a;
}while(*(pt+(j+COL*i+a))==0);
if(a>3)
{
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i+1))==0&&*(pt+j+COL*(i+2))==0&&*(pt+j+COL*(i+3))==0)
{
//&&*(pt+j+COL*(i+4))==0&&*(pt+j+COL*(i+5))==0&&*(pt+j+COL*(i+6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else if(*(pt+j+COL*(i-1))==0&&*(pt+j+COL*(i-2))==0&&*(pt+j+COL*(i-3))==0)
{
//&&*(pt+j+COL*(i-4))==0&&*(pt+j+COL*(i-5))==0&&*(pt+j+COL*(i-6))==0
for(m=0;m<a;m++)
{
b=b+bufw[m];
}
p1->thing=0;//标志车
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
else
{
for(m=0;m<a;m++)
b=b+bufw[m];
n=getthing(head->next,i);//区分信标
p1->thing=n;
p1->x=b/a;
p1->y=i;
p1->next=head->next;
head->next=p1;
p1=(struct center*)malloc(sizeof(struct center));
}
}
}
}
}
}
head=head->next;
while(head)
{
if(head->thing==0)
{ car++;
car_sumw=car_sumw+head->x;
car_sumh=car_sumh+head->y;
}
else if(head->thing==1)
{ single1++;
single1_sumw=single1_sumw+head->x;
single1_sumh=single1_sumh+head->y;
}
else if(head->thing==2)
{ single2++;
single2_sumw=single2_sumw+head->x;
single2_sumh=single2_sumh+head->y;
}
else if(head->thing==3)
{ single3++;
single3_sumw=single3_sumw+head->x;
single3_sumh=single3_sumh+head->y;
}
else if(head->thing==4)
{ single4++;
single4_sumw=single4_sumw+head->x;
single4_sumh=single4_sumh+head->y;
}
else if(head->thing==5)
{ single5++;
single5_sumw=single5_sumw+head->x;
single5_sumh=single5_sumh+head->y;
}
printf("%d__%d__%d\n",head->thing,head->x,head->y);
head=head->next;
}
car_avgw=car_sumw/car;
car_avgh=car_sumh/car;
single1_avgw=single1_sumw/single1;
single1_avgh=single1_sumh/single1;
single2_avgw=single2_sumw/single2;
single2_avgh=single2_sumh/single2;
single3_avgw=single3_sumw/single3;
single3_avgh=single3_sumh/single3;
single4_avgw=single4_sumw/single4;
single4_avgh=single4_sumh/single1;
single4_avgw=single4_sumw/single4;
single4_avgh=single4_sumh/single4;
printf("车的中心坐标:(%d,%d)\n",car_avgw,car_avgh);
printf("信标1的中心坐标:(%d,%d)\n",single1_avgw,single1_avgw);
printf("信标2的中心坐标:(%d,%d)\n",single2_avgw,single2_avgw);
printf("信标3的中心坐标:(%d,%d)\n",single3_avgw,single3_avgw);
printf("信标4的中心坐标:(%d,%d)\n",single4_avgw,single4_avgw);
printf("信标5的中心坐标:(%d,%d)\n",single5_avgw,single5_avgw);
}
int getthing(struct center *pp,int i)
{
static int n=6;
int a=0,b=0;
while(pp)
{
if(pp->thing ==0)
{
a=pp->thing;
pp=pp->next;
}
else if(i-pp->y<6&&i-pp->y>-6)
{
n=pp->thing;
break;
}
else
{
a=pp->thing;
pp=pp->next;
}
if(a>b)
{
b=a;
}
}
if(n==6)
{
n=b+1;
}
return n;
}