poj 2329 Nearest number - 2 bfs

泪奔啊!原来STL中的queue那么慢..改了一下午还以为是算法错了呢..

#include<stdio.h>
#include<string.h>

#define inf 0x3f3f3f3f

struct node{
	int x,y,step;
}a[1000000];

int vis[40000][2],ar[201][201],ans[201][201][2],x,y,n;

void bfs(int x)
{
	int i,row,col,front=0,tail=1;
	int dir[4][2]={0,1,1,0,-1,0,0,-1};
	while(front!=tail)
	{
		for(i=0;i<4;i++)
		{
			row=dir[i][0]+a[front].x;
			col=dir[i][1]+a[front].y;
			if(row>=0&&col>=0&&row<n&&col<n&&!ar[row][col])
			{
				ar[row][col]=-1;
				a[tail].x=row;
				a[tail].y=col;
				a[tail].step=a[front].step+1;
				
				if(ans[row][col][0]>a[tail].step)
				{
					ans[row][col][0]=a[tail].step;
					ans[row][col][1]=x;
				}
				else if(ans[row][col][0]==a[tail].step)
				{
					ans[row][col][1]=0;
				}
				tail++;
			}
		}
		front++;
	}
}

int main()
{
	int i,j,k=0,an[201][201];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&an[i][j]);
			ans[i][j][1]=an[i][j];
			ans[i][j][0]=inf;
			if(an[i][j])
			{
				vis[k][0]=i;
				vis[k++][1]=j;
			}
		}
	}
	if(n==1)
	{
		printf("%d\n",an[0][0]);
		return 0;
	}
	for(i=0;i<k;i++)
	{
		memcpy(ar,an,sizeof(ar));
		a[0].x=vis[i][0];
		a[0].y=vis[i][1];
		a[0].step=0;
		bfs(ar[vis[i][0]][vis[i][1]]);
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%d ",ans[i][j][1]);
		printf("\n");
	}
	return 0;
}
posted @ 2011-10-21 21:28  104_gogo  阅读(156)  评论(0编辑  收藏  举报