标签:
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 7902 | Accepted: 1827 |
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
题意:有m个墙,n个门。接下来m行 每行输入x,y,d,t分别代表左下角的(X,Y)坐标,d=1代表代表墙平行于y轴,d=0代表墙平行于x轴,t代表该行或该列上有多少墙。
思路:每个网格的坐标用网格左下角坐标来代替,用第三维来代表网格的上边和右边。然后BFS搜索,要全部搜索完取最小值。
三维map的结果0代表空地,1代表墙,2代表门,map[X][Y][0]代表此表格的上方,map[X][Y][1]代表此表格的右方。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int inf=0x3f3f3f3f; struct node { int x, y; int ans; } f1,f2; int map[210][210][3]; int vis[210][210]; int jx[]= {0,0,1,-1}; int jy[]= {1,-1,0,0}; int min1; void bfs(int s, int e) { int i, j; queue<node>q; f1.x=s; f1.y=e; f1.ans=0; vis[s][e]=1; q.push(f1); min1=inf; while(!q.empty()) { f1=q.front(); q.pop(); if(f1.x<=0||f1.x>=199||f1.y<=0||f1.y>=199) {//边界处理,但是不能跳出,只能跳过,因为存在多个门的情况 min1=min(min1,f1.ans); //走出去之后,保存最小通过门数 continue ; } for(i=0; i<4; i++) { f2.x=f1.x+jx[i]; f2.y=f1.y+jy[i]; if(i==0) {//向上走 if(!vis[f2.x][f2.y]&&map[f1.x][f1.y][0]!=2) { if(map[f1.x][f1.y][0]==1) f2.ans=f1.ans+1; else f2.ans=f1.ans; vis[f2.x][f2.y]=1; q.push(f2); } } else if(i==1) {//向下走 if(!vis[f2.x][f2.y]&&map[f2.x][f2.y][0]!=2) { if(map[f2.x][f2.y][0]==1) f2.ans=f1.ans+1; else f2.ans=f1.ans; vis[f2.x][f2.y]=1; q.push(f2); } } else if(i==2) {//向右走 if(!vis[f2.x][f2.y]&&map[f1.x][f1.y][1]!=2) { if(map[f1.x][f1.y][1]==1) f2.ans=f1.ans+1; else f2.ans=f1.ans; vis[f2.x][f2.y]=1; q.push(f2); } } else if(i==3) {//向左走 if(!vis[f2.x][f2.y]&&map[f2.x][f2.y][1]!=2) { if(map[f2.x][f2.y][1]==1) f2.ans=f1.ans+1; else f2.ans=f1.ans; vis[f2.x][f2.y]=1; q.push(f2); } } } } } int main() { int n, m, i, j; int x,y,d,t; double a1,a2; int int_x,int_y; while(scanf("%d %d",&m,&n)!=EOF) { if(n==-1&&m==-1) break; memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); for(i=0; i<m; i++) { scanf("%d %d %d %d",&x, &y, &d, &t); if(d) { for(j=0; j<t; j++) { map[x-1][y+j][1]=2; } } else { for(j=0; j<t; j++) { map[x+j][y-1][0]=2; } } } for(i=0; i<n; i++) { scanf("%d %d %d",&x,&y,&d); if(d) { map[x-1][y][1]=1; } else { map[x][y-1][0]=1; } } scanf("%lf %lf",&a1,&a2); int_x=a1; int_y=a2; if(int_x<=0||int_x>=199||int_y<=0||int_y>=199) {//后台可能出现 0,0 200+,200+,虽然不符合题目描述 printf("0\n"); continue ; } bfs(int_x,int_y); if(min1==inf) printf("-1\n"); else printf("%d\n",min1); } return 0; }
POJ 2049-Finding Nemo(三维bfs解决类迷宫问题)
标签:
原文地址:http://blog.csdn.net/u013486414/article/details/42524021