Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

眼睛一闭一挣 BFS-TLE !眼睛一闭再挣 继续TLE! 进来看看啦

Posted by 200609020331 at 2009-03-16 19:51:40 on Problem 1101
鄙人是用BFS做的+保存路径 用总数减去 由里面往边界走的和由外面往里面走的 代码如下 一直TLE 帮我看看 非常谢谢!
#include<iostream>
using namespace std;
#define MAX 2*60000

int turn[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct Point
{
	int x,y;
}queue[MAX],pre[6000];
bool mk[100][100];
int map[100][100];
int counts[100][100];
int x3[100],y3[100];
bool nod;
int n,m,cnt;

int BFS(int x,int y,int x2,int y2)
{
	int front=0,rear=0;
	int i;
	int a,b;
	for(i=0;i<100;i++)
	{
		x3[i]=-1;
		y3[i]=-1;
	}
	memset(counts,0,sizeof(counts));
	mk[x][y]=true;
	queue[rear].x=x;
	queue[rear].y=y;
	rear++;
	while(front<rear)
	{
		x=queue[front].x;
		y=queue[front].y;
		front++;
		for(i=0;i<4;i++)
		{
			a=x+turn[i][0];
			b=y+turn[i][1];
			if(!mk[a][b] && map[a][b] && a>=0 && a<=m+1 && b>=0 && b<=n+1)
			{
				mk[a][b]=true;
                x3[a]=x;
				y3[b]=y;
				counts[a][b]=counts[x][y]+1;
				if(a==x2 && b==y2)
					return counts[a][b];
				queue[rear].x=a;
				queue[rear].y=b;
				rear++;
			}
		}
	}
	return 0;
}

int main()
{
	int i,j,count=1;
	int x,y,x1,y1,a,b,e,f;
	int t1,t2,ant;
	bool flag;
	char ch;
	while(1)
	{
		scanf("%d%d",&n,&m);
		if(n==0 && m==0)
			break;
		for(i=0;i<=80;i++)
			for(j=0;j<=80;j++)
				map[i][j]=1;
			memset(mk,false,sizeof(mk));
			for(i=1;i<=m;i++)
			{
				getchar();
				for(j=1;j<=n;j++)
				{
					while(scanf("%c",&ch)&& ch!='X' && ch!=' ');
					if(ch=='X')
						map[i][j]=0;
					
				}
			}
			i=1;
			flag=true;
			while(1)
			{
				scanf("%d%d%d%d",&x,&y,&x1,&y1);
				if(x==0 && y==0 && x1==0 && y1==0)
					break;
				
				nod=false;
				cnt=0;
				e=x1;
				f=y1;
				t1=map[y][x];
				t2=map[y1][x1];
				map[y][x]=1;
				map[y1][x1]=1;
				if(flag)
				{
					printf("Board #%d:\n",count);
					flag=false;
				}
				ant=BFS(y,x,y1,x1);
				while(x3[f]!=-1 && y3[e]!=-1)
				{
					a=x3[e];
					b=y3[f];
					if((e!=0 && e!=m+1 && f!=0 && f!=n+1) && (a==0 || a==m+1 || b==0 || b==n+1))
					{
						nod=true;
						cnt++;
					}
					e=a;
					f=b;
				}            
				if( ant && !nod)
					printf("Pair %d: %d segments.\n",i,counts[y1][x1]-1);
				else if(ant && nod)
					printf("Pair %d: %d segments.\n",i,counts[y1][x1]-2*cnt-1);
				else
					printf("Pair %d: impossible.\n",i);
				map[y][x]=t1;
				map[y1][x1]=t2;
				i++;
			}
			count++;
	}
	return 0;
}








 

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator