刚开始写的竟然WA,至今不知原因...
/*
* s.c
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 1010
#define QSIZE 10000
typedef struct _node
{
int x;
int y;
}node;
int T,R,C;
char f[SIZE][SIZE];
int g[SIZE][SIZE];
node que[QSIZE];
int head,tail,len;
int d[4][2]={
{0,1}, /* R */
{0,-1}, /* L */
{1,0}, /* D */
{-1,0} /* U */
};
int push(int x,int y)
{
que[tail].x=x;
que[tail].y=y;
tail++;
len++;
if(tail==QSIZE)
tail=0;
return 0;
}
int pop(int *x, int *y)
{
*x=que[head].x;
*y=que[head].y;
head++;
len--;
if(head==QSIZE)
head=0;
return 0;
}
int search(void) /* flood fill... */
{
if(f[0][0]=='*' || f[R-1][C-1]=='*')
return -1;
int i,x,y,xx,yy,start,end;
/* initialize */
head=tail=len=0;
memset(g,0,sizeof(g));
push(0,0);
g[0][0]=1;
while(len>0)
{
pop(&x,&y);
start=0;
end=3;
if(f[x][y]=='-')
end=1;
else if(f[x][y]=='|')
start=2;
for(i=start;i<=end;i++)
{
xx=x+d[i][0];
yy=y+d[i][1];
if(xx>=0 && xx<R && yy>=0 && yy<C && f[xx][yy]!='*'
&& !g[xx][yy]) /* !g[xx][yy] <- not visited */
{
g[xx][yy]=g[x][y]+1;
push(xx,yy);
}
}
}
if(g[R-1][C-1]==0)
return -1;
else
return g[R-1][C-1];
}
int main(void)
{
int i,j;
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
scanf("%d",&T);
for(i=0;i<T;i++)
{
scanf("%d%d",&R,&C);
for(j=0;j<R;j++)
scanf("%s",f[j]);
printf("%d\n",search());
}
return 0;
}