project-population

四叉树法完成

 

#include <stdio.h>

#include <stdlib.h>

#ifndef QuadTree

typedef struct quadtreenode *Quadtree;

 

#endif

#define MAX_SIZE (20000)

 

struct quadtreenode

{

int totalnum;/*the total population number in the area*/

Quadtree leftback;

Quadtree leftfront;

Quadtree rightback;

Quadtree rightfront;

int up,down,left,right;/*record the edge*/

};

 

int sum;

 

Quadtree Create(Quadtree T)/*create a quadtree node*/

{

T=(Quadtree)malloc(sizeof(struct quadtreenode));

T->leftback=T->leftfront=T->rightback=T->rightfront=NULL;

T->totalnum=0;

return T;

}

 

Quadtree Insert(int X,int Y,int N,Quadtree T)

{

int xu,xd,yl,yr;

yl=T->left;yr=T->right;

xu=T->up;xd=T->down;

 

if(yl==yr&&xu==xd)/*if it is a leaf node then return T*/

{

return T;

}

else/*(x,y)is in the leftback region*/

if(xu<=X&&X<=(xu+xd)/2&&yl<=Y&&Y<=(yr+yl)/2){

if(T->leftback==NULL){/*create the region and set totalnum be the region's total number*/

T->leftback=Create(T->leftback);

T->leftback->left=yl;

T->leftback->right=(yr+yl)/2;

T->leftback->up=xu;

T->leftback->down=(xu+xd)/2;

T->leftback->totalnum=N;/*first set the region's population*/

}

else

T->leftback->totalnum+=N;/*add the new come in population number*/

T->leftback=Insert(X,Y,N,T->leftback);/*insert to the small region*/

}

else/*(x,y)is in the rightback region*/

if(xu<=X&&X<=(xu+xd)/2&&(yr+yl)/2<Y&&Y<=yr){

if(T->rightback==NULL){

T->rightback=Create(T->rightback);

T->rightback->left=(yr+yl)/2+1;

T->rightback->right=yr;

T->rightback->up=xu;

T->rightback->down=(xu+xd)/2;

T->rightback->totalnum=N;

}

   else

T->rightback->totalnum+=N;

   T->rightback=Insert(X,Y,N,T->rightback);

}

else/*(x,y)is in the leftfront region*/

if((xu+xd)/2<X&&X<=xd&&yl<=Y&&Y<=(yr+yl)/2){

if(T->leftfront==NULL){

    T->leftfront=Create(T->leftfront);

T->leftfront->left=yl;

T->leftfront->right=(yl+yr)/2;

T->leftfront->up=(xu+xd)/2+1;

T->leftfront->down=xd;

T->leftfront->totalnum=N;

}

       else

T->leftfront->totalnum+=N;

       T->leftfront=Insert(X,Y,N,T->leftfront);

}

else/*(x,y)is in the rightfront region*/

if((xu+xd)/2<X&&X<=xd&&(yr+yl)/2<Y&&Y<=yr)

{

if(T->rightfront==NULL){

       T->rightfront=Create(T->rightfront);

T->rightfront->left=(yr+yl)/2+1;

T->rightfront->right=yr;

T->rightfront->up=(xu+xd)/2+1;

T->rightfront->down=xd;

T->rightfront->totalnum=N;

}

else

T->rightfront->totalnum+=N;

           T->rightfront=Insert(X,Y,N,T->rightfront);

}

 

return T;

}

 

 

 

void inorder(int Xmin,int Xmax,int Ymin,int Ymax,Quadtree T)

{

if(T){

if(T->up>=Xmin&&T->down<=Xmax&&T->left>=Ymin&&T->right<=Ymax)

sum=sum+T->totalnum;/*when the region is in the retangles,add to sum*/

else{/*if the region is cover the retangles then traversal the smallregion*/

if(!(Xmin>T->down||Ymin>T->right||Xmax<T->up||Ymax<T->left)){

inorder(Xmin,Xmax,Ymin,Ymax,T->leftback);

inorder(Xmin,Xmax,Ymin,Ymax,T->rightback);

inorder(Xmin,Xmax,Ymin,Ymax,T->leftfront);

inorder(Xmin,Xmax,Ymin,Ymax,T->rightfront);

}

}

}

}

 

void CountSum(Quadtree T)

{

int Xmin,Xmax,Ymin,Ymax;

while(scanf("%d", &Xmin) == 1) {

        scanf("%d%d%d", &Xmax, &Ymin, &Ymax);

sum=0;

   inorder(Xmin,Xmax,Ymin,Ymax,T);/*do inorder traversal and calculate all the population*/

     printf("%d\n",sum);

    }   

}

 

Quadtree Insertion(Quadtree T)

{

int X,Y,N;

while(scanf("%d", &X) == 1) {

   scanf("%d%d", &Y, &N);

T->totalnum+=N;

   T=Insert(X,Y,N,T);/*keep inserting*/

}    

return T;

}

 

int main()

{

char c,s[20];

Quadtree T;

/*make the root be empty and stand for the whole area*/

T=NULL;

T=Create(T);

T->left=T->up=1;

T->right=T->down=MAX_SIZE;

 

while(scanf("%s",s)!=EOF)/*stop when the file is over*/

{

c=s[0];

switch (c){

   case 'Q':

   CountSum(T);/*count out the population in the region*/

   break;

   case 'I':

   T=Insertion(T);/*insert the population number in the right region*/

   break;

case 'E':

T=NULL;/*clean the tree*/

T=Create(T);

               T->left=T->up=1;

               T->right=T->down=MAX_SIZE;

break;

   }

}

return 0;

}

 

 

 

 

 

附加一AVL-tree搜索

 

#include <stdio.h>

#include <stdlib.h>

#ifndef _AvlTree_H

 

struct AvlNode;

typedef struct AvlNode *Position;

typedef struct AvlNode *AvlTree;

typedef int ElementType;

 

AvlTree Insert(int X,int Y,AvlTree T,int N);

int Max(int a,int b);

 

#endif  //_AvlNode_H

 

struct AvlNode

{

ElementType Element;

int ElementX;

int ElementY;

AvlTree Left;

AvlTree Right;

int Height;

};

AvlTree T;

int sum;

static int

Height(Position P)

{

if(P==NULL)

return -1;

else

return P->Height;

}

 

int Max(int a,int b)

{

if(a>b)

return a;

else

return b;

}

 

static Position

SingleRotateWithLeft(Position K2)

{

Position K1;

K1=K2->Left;

K2->Left=K1->Right;

K1->Right=K2;

 

K2->Height=Max(Height(K2->Left),Height(K2->Right))+1;

K1->Height=Max(Height(K1->Left),K2->Height)+1;

 

return K1;

}

 

static Position

SingleRotateWithRight(Position K2)

{

Position K1;

K1=K2->Right;

K2->Right=K1->Left;

K1->Left=K2;

 

K2->Height=Max(Height(K2->Left),Height(K2->Right))+1;

K1->Height=Max(Height(K1->Right),K2->Height)+1;

 

return K1;

}

 

static Position

DoubleRotateWithLeft(Position K3)

{

K3->Left=SingleRotateWithRight(K3->Left);

 

return SingleRotateWithLeft(K3);

}

 

static Position

DoubleRotateWithRight(Position K3)

{

K3->Right=SingleRotateWithLeft(K3->Right);

 

return SingleRotateWithRight(K3);

}

 

AvlTree

Insert(int X,int Y,AvlTree T,int N)

{

if(T==NULL)

{

T=(AvlTree)malloc(sizeof(struct AvlNode));

if(T==NULL)

exit(0);

else

{

T->Element=N;

T->ElementX=X;T->ElementY=Y;

T->Height=0;

T->Left=T->Right=NULL;

}

}

else

if(X<T->ElementX||(X==T->ElementX&&Y<T->ElementY))

{

T->Left=Insert(X,Y,T->Left,N);

if(Height(T->Left)-Height(T->Right)==2)

if(X<T->Left->ElementX||(X==T->Left->ElementX&&Y<T->Left->ElementY))

T=SingleRotateWithLeft(T);

else

T=DoubleRotateWithLeft(T);

}

else

if(X>T->ElementX||(X==T->ElementX&&Y>T->ElementY))

{

T->Right=Insert(X,Y,T->Right,N);

if(Height(T->Right)-Height(T->Left)==2)

if(X>T->Right->ElementX||(X==T->Right->ElementX&&Y>T->Right->ElementY))

T=SingleRotateWithRight(T);

else

T=DoubleRotateWithRight(T);

}

else

if(X==T->ElementX&&Y==T->ElementY)

T->Element+=N;

 

T->Height=Max(Height(T->Left),Height(T->Right))+1;

return(T);

}

 

void inorder(int Xmin,int Xmax,int Ymin,int Ymax,AvlTree T)

{

if(T){

if(T->ElementX>=Xmin)

inorder(Xmin,Xmax,Ymin,Ymax,T->Left);

if(T->ElementX>=Xmin&&T->ElementY>=Ymin&&T->ElementX<=Xmax&&T->ElementY<=Ymax)

sum=sum+T->Element;

if(T->ElementX<=Xmax)

inorder(Xmin,Xmax,Ymin,Ymax,T->Right);

}

}

 

void CountSum()

{

int Xmin,Xmax,Ymin,Ymax;

while(scanf("%d", &Xmin) == 1) {

        scanf("%d%d%d", &Xmax, &Ymin, &Ymax);

     sum=0;

   inorder(Xmin,Xmax,Ymin,Ymax,T);

     printf("%d\n",sum);

    }   

}

 

void Insertion()

{

int X,Y,N;

 

while(scanf("%d", &X) == 1) {

   scanf("%d%d", &Y, &N);

   T = Insert(X,Y,T,N);

}    

}

 

int main()

{

char c,s[20];

freopen("data.txt","r",stdin);

 

while(scanf("%s",s)!=EOF)

{

c=s[0];

switch (c){

   case 'Q':

   CountSum();

   break;

   case 'I':

   Insertion();

   break;

case 'E':

T=NULL;

break;

   }

}

fclose(stdin);

return 0;

}

posted @ 2011-01-11 15:22  楚夕  阅读(212)  评论(0编辑  收藏  举报