Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 7317 | Accepted: 1698 |
Description
Input
Output
Sample Input
8 9 1 1 1 3 2 1 1 3 3 1 1 3 4 1 1 3 1 1 0 3 1 2 0 3 1 3 0 3 1 4 0 3 2 1 1 2 2 1 2 3 1 3 1 1 3 2 1 3 3 1 1 2 0 3 3 0 4 3 1 1.5 1.5 4 0 1 1 0 1 1 1 1 1 2 1 1 1 1 2 0 1 1.5 1.7 -1 -1
Sample Output
5 -1
Source
有一个迷宫,在迷宫中有墙与门
有m道墙,每一道墙表示为(x,y,d,t)
x,y表示墙的起始坐标
d为0即向右t个单位,都是墙
d为1即向上t个单位,都是墙
有n道门,每一道门表示为(x,y,d)
x,y表示门的起始坐标
d为0即向右一个单位表示门
d为1即向上一个单位表示门
再给出你起点的位置(f1,f2),并保证这个点的位置不会再墙或者门中,为起点到(0,0)最少要穿过多少条门
注意:在迷宫中不只有门和墙,还有空地
#include
#include
int p[210][210][2] ; //0代表向右,1代表向上 //0代表空白,1代表门,2代表墙
int s[4][2] = { {-1,0},{1,0},{0,1},{0,-1} } ;
struct node{
int x , y , num ;
}q[100000];
int r[210][210] ;
int main()
{
int m , n , i , j , x , y , d , t ;
while(scanf("%d %d", &m, &n)!=EOF)
{
if(m == -1 && n == -1)
break;
memset(p,0,sizeof(p));
memset(r,0,sizeof(r));
for(i = 0 ; i < m ; i++)
{
scanf("%d %d %d %d", &x, &y, &d, &t);
if(d == 0)
{
for(j = x ; j < x + t ; j++)
p[j][y][d] = 2 ;
}
else
{
for(j = y ; j < y + t ; j++)
p[x][j][d] = 2 ;
}
}
for(i = 0 ; i < n ; i++)
{
scanf("%d %d %d", &x, &y, &d);
p[x][y][d] = 1 ;
}
double xx , yy ;
scanf("%lf %lf", &xx, &yy);
x = xx ;
y = yy ;
if(x == 0 || y == 0 || x >= 199 || y >= 199)
printf("0\n");
else
{
int low = 0 , top = 1 ;
q[0].x = x ;
q[0].y = y ;
q[0].num = 0 ;
r[x][y] = 1 ;
int num = 9999999 ;
while(low < top)
{
node k ;
k = q[low++] ;
if( (k.x == 0 || k.y == 0 || k.x >= 199 || k.y >= 199) && k.num < num )
{
num = k.num ;
continue ;
}
if(k.num >= num)
continue ;
int u , v ;
for(i = 0 ; i < 4 ; i++)
{
u = k.x + s[i][0] ;
v = k.y + s[i][1] ;
if(u < 0 || v < 0 || r[u][v] == 1)
continue ;
if(i == 0 && p[k.x][k.y][1] != 2 )
{
q[top].x = u ;
q[top].y = v ;
if(p[k.x][k.y][1] == 1)
q[top].num = k.num+1 ;
else
q[top].num = k.num ;
r[u][v] = 1 ;
top++ ;
}
else if(i == 1 && p[u][v][1] != 2 )
{
q[top].x = u ;
q[top].y = v ;
if(p[u][v][1] == 1)
q[top].num = k.num+1 ;
else
q[top].num = k.num ;
r[u][v] = 1 ;
top++ ;
}
else if(i == 2 && p[u][v][0] != 2)
{
q[top].x = u ;
q[top].y = v ;
if(p[u][v][0] == 1)
q[top].num = k.num+1 ;
else
q[top].num = k.num ;
r[u][v] = 1 ;
top++ ;
}
else if(i == 3 && p[k.x][k.y][0] != 2)
{
q[top].x = u ;
q[top].y = v ;
if(p[k.x][k.y][0] == 1)
q[top].num = k.num+1 ;
else
q[top].num = k.num ;
r[u][v] = 1 ;
top++ ;
}
}
}
if(num == 9999999)
printf("-1\n");
else
printf("%d\n", num);
}
}
return 0;
}