project-attact of panda virus

此程序为次品.......

 

#include <stdio.h>

#include <stdlib.h>

#define MAX_SIZE (100000)

int list[500][500];

int total;

int n,m,Q,vir[10000],type[10000];

 

struct stackrecord

{

int row;

int col;

struct stackrecord *next;

};

 

typedef struct stackrecord *stack;

stack s;

typedef stack nodeplace;

 

void mkempty()

{

s=(stack)malloc(sizeof(nodeplace));

s->next=NULL;

}

 

void push(int row,int col)

{

nodeplace temp,p,top;

temp=(stack)malloc(sizeof(nodeplace));

temp->row=row;

temp->col=col;

top=s->next;

p=s;

while(top!=NULL&&list[top->row][top->col]<list[row][col])

{

p=top;

top=top->next;

}

p->next=temp;

temp->next=top;

total++;

vir[list[row][col]]++;

}

 

void insertion(nodeplace p,int row,int col)

{

nodeplace temp;

list[row][col]=list[p->row][p->col];

temp=(stack)malloc(sizeof(nodeplace));

temp->row=row;

temp->col=col;

temp->next=p->next;

p->next=temp;

vir[list[row][col]]++;

total++;

}

 

int check(nodeplace p)

{

if((p->row==0||p->row>0&&list[p->row-1][p->col]>0)

&&(p->row==m-1||p->row<m-1&&list[p->row+1][p->col]>0)

&&(p->col==0||p->col>0&&list[p->row][p->col-1]>0)

&&(p->col==n-1||p->col<n-1&&list[p->row][p->col+1]>0))

return 1;

return 0;

}

 

void search()

{

int min;

int day=1;

nodeplace p,pt;

while(total<m*n)

{

min=MAX_SIZE;

p=s->next;

pt=s;

while(p!=NULL)

{

if(p->row>0&&list[p->row-1][p->col]<0)

if(list[p->row-1][p->col]+day>=0)

insertion(p,p->row-1,p->col);

   else

   if(-list[p->row-1][p->col]-day<min)

   min=-list[p->row-1][p->col]-day;

if(p->row<m-1&&list[p->row+1][p->col]<0)

if(list[p->row+1][p->col]+day>=0)

   insertion(p,p->row+1,p->col);

   else

   if(-list[p->row+1][p->col]-day<min)

   min=-list[p->row+1][p->col]-day;

if(p->col>0&&list[p->row][p->col-1]<0)

if(list[p->row][p->col-1]+day>=0)

   insertion(p,p->row,p->col-1);

   else

   if(-list[p->row][p->col-1]-day<min)

   min=-list[p->row][p->col-1]-day;

if(p->col<n-1&&list[p->row][p->col+1]<0)

if(list[p->row][p->col+1]+day>=0)

   insertion(p,p->row,p->col+1);

   else

   if(-list[p->row][p->col+1]-day<min)

   min=-list[p->row][p->col+1]-day;

if(check(p))

pt->next=p->next;

else

pt=p;

p=p->next;

}

day+=min;

}

}

 

int main()

{

 

    int times=0;

int i,j;

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

    scanf("%d%d",&m,&n);

    while(m!=0&&n!=0)

    {

/*预处理*/

total=0;

        times++;

mkempty();

for(i=0;i<500;i++)

for(j=0;j<500;j++)

list[i][j]=0;

for(i=0;i<1000;i++)

{

vir[i]=0;

type[i]=0;

}

/*输入*/

        for(i=0;i<m;i++)

for(j=0;j<n;j++)

{

scanf("%d",&list[i][j]);

                if(list[i][j]>0)

push(i,j);

}

scanf("%d",&Q);

for(i=0;i<Q;i++)

scanf("%d",&type[i]);

 

search();/*搜索*/

/*输出*/

printf("Scenario #%d\n",times);

for(i=0;i<Q;i++)

   printf("%d\n",vir[type[i]]);

scanf("%d%d",&m,&n);

if(m!=0&&n!=0)

printf("\n");

}

fclose(stdin);

return 0;

}

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