POJ 2049 Finding Nemo(3 D BFS)


タイトルアドレス:http://poj.org/problem?id=2049
この問題は1日WAでしたが、結局C++をG++に変更して過ぎました.なぜか分かりません.
この構想は,各メッシュの座標をメッシュの左下角座標に置き換え,メッシュの上と右を3次元で表すことである.
そして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
",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
",a-1,b+j); } } else { for(j=0; j<d; j++) { mp[a+j][b-1][0]=2; //printf("%d %d 1
",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
"); continue ; } memset(vis,0,sizeof(vis)); bfs(a,b); if(min1==10000000) printf("-1
"); else printf("%d
",min1); } return 0; }