题目地址:http://poj.org/problem?id=2049
这题WA了一天啊,结果最后把C++改成G++就过了。。不知道为什么。。
这题思路是把每个网格的坐标用网格左下角坐标来代替,用第三维来代表网格的上边和右边。
然后BFS搜索,要全部搜索完取最小值。
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <algorithm> using namespace std; struct node { int x, y, ans; }; int mp[220][220][3], vis[220][220];/*mp数组结果,0代表空地,1代表门,2代表墙,第三维的0代表此表格的上方,1代表表格的右侧*/ int jx[]= {0,0,1,-1}; int jy[]= {1,-1,0,0}; int min1; void bfs(int s, int t) { int i, j; queue<node>q; node f1, f2; f1.x=s; f1.y=t; f1.ans=0; vis[s][t]=1; q.push(f1); min1=10000000; while(!q.empty()) { f1=q.front(); q.pop(); //if(f1.x<=4&&f1.y<=4) //printf("%d %d %d\n",f1.x, f1.y, f1.ans); if(f1.x>=199||f1.y>=199||f1.x==0||f1.y==0) { if(min1>f1.ans) { min1=f1.ans; } continue ; } if(f1.ans>=min1) continue ; f2.x=f1.x+jx[0]; f2.y=f1.y+jy[0]; if(!vis[f2.x][f2.y]&&mp[f1.x][f1.y][0]!=2)//向下走 { if(mp[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); } f2.x=f1.x+jx[1]; f2.y=f1.y+jy[1]; if(!vis[f2.x][f2.y]&&mp[f2.x][f2.y][0]!=2)//向下走 { if(mp[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); } f2.x=f1.x+jx[2]; f2.y=f1.y+jy[2]; if(!vis[f2.x][f2.y]&&mp[f1.x][f1.y][1]!=2)//向右走 { if(mp[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); } f2.x=f1.x+jx[3]; f2.y=f1.y+jy[3]; if(!vis[f2.x][f2.y]&&mp[f2.x][f2.y][1]!=2)//向左走 { if(mp[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, a, b, c, d; double x, y; while(scanf("%d%d",&n,&m)!=EOF) { if(n==-1&&m==-1) break; memset(mp,0,sizeof(mp)); for(i=0; i<n; i++) { scanf("%d%d%d%d",&a, &b, &c, &d); if(c) { for(j=0; j<d; j++) { mp[a-1][b+j][1]=2; //printf("%d %d 0\n",a-1,b+j); } } else { for(j=0; j<d; j++) { mp[a+j][b-1][0]=2; //printf("%d %d 1\n",a+j,b-1); } } } for(i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c); if(c) { mp[a-1][b][1]=1; } else { mp[a][b-1][0]=1; } } scanf("%lf%lf",&x,&y); a=x; b=y; if(a>=199||b>=199||a<=0||b<=0) { printf("0\n"); continue ; } memset(vis,0,sizeof(vis)); bfs(a,b); if(min1==10000000) printf("-1\n"); else printf("%d\n",min1); } return 0; }