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 <stdio.h> #include <string.h> 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; }