Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 8117 | Accepted: 1883 |
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#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <queue> #include <stack> #include <map> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int Map[210][210][2]; bool vis[210][210]; int n,m,Max; double fx,fy; int Fx,Fy; struct node { int x; int y; int ans; }; void BFS() { queue<node>Q; node a,b; a.x=Fx; a.y=Fy; a.ans=0; Max=INF; memset(vis,false,sizeof(vis)); vis[Fx][Fy]=true; Q.push(a); while(!Q.empty()) { a=Q.front(); Q.pop(); if(a.x==0||a.x>199||a.y==0||a.y>199) { if(a.ans<Max) { Max=a.ans; } continue; } if(a.ans>Max)剪枝 { continue; } b.x=a.x+1; b.y=a.y; if(!vis[b.x][b.y]&&Map[a.x][a.y][1]!=1)//由于用左边或下边的点表示该点的状态,所以对于向右或向上判断Map[a.x][a.y][]的状态、 { //对于向左或向下判断Map[b.x][b.y]的状态 vis[b.x][b.y]=true; if(Map[a.x][a.y][1]==2) { b.ans=a.ans+1; } else { b.ans=a.ans; } Q.push(b); } b.x=a.x-1; b.y=a.y; if(!vis[b.x][b.y]&&Map[b.x][b.y][1]!=1) { vis[b.x][b.y]=true; if(Map[b.x][b.y][1]==2) { b.ans=a.ans+1; } else { b.ans=a.ans; } Q.push(b); } b.x=a.x; b.y=a.y+1; if(!vis[b.x][b.y]&&Map[a.x][a.y][0]!=1) { vis[b.x][b.y]=true; if(Map[a.x][a.y][0]==2) { b.ans=a.ans+1; } else { b.ans=a.ans; } Q.push(b); } b.x=a.x; b.y=a.y-1; if(!vis[b.x][b.y]&&Map[b.x][b.y][0]!=1) { vis[b.x][b.y]=true; if(Map[b.x][b.y][0]==2) { b.ans=a.ans+1; } else { b.ans=a.ans; } Q.push(b); } } if(Max==INF) { cout<<"-1"<<endl; } else printf("%d\n",Max); } int main() { int x,y,t,d; while(scanf("%d %d",&n,&m)) { if(n==-1&&m==-1) { break; } memset(Map,0,sizeof(Map)); while(n--) { scanf("%d %d %d %d",&x,&y,&d,&t); if(d) { for(int i=0; i<t; i++)//用左边或下边的点表示该点的状态 { Map[x-1][y+i][1]=1; } } else { for(int i=0; i<t; i++) { Map[x+i][y-1][0]=1; } } } while(m--) { scanf("%d %d %d",&x,&y,&d); if(d) { Map[x-1][y][1]=2; } else { Map[x][y-1][0]=2; } } scanf("%lf %lf",&fx,&fy); Fx=int(fx); Fy=int(fy); if(Fx==0||Fy==0||Fx>199||Fy>199) { printf("0\n"); continue; } BFS(); } return 0; }