| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
眼睛一闭一挣 BFS-TLE !眼睛一闭再挣 继续TLE! 进来看看啦鄙人是用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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator