此程序为次品.......
#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;
}