标签:
| 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