POJ 3083 BFS+DFS 40行

题意:给你一个迷宫。 先输出当左转优先的时候走的路程长度,再输出当右转优先时走的路程长度,最后输出从起点到终点的最短路程长度。

嗯嗯 奴哥活跃气氛的题。随便写了写。。

此题 知道了思路以后就是水题了。。。。
再随便缩缩行也就不到40行 (网上的题解好多200+的。。)
发现pair是个很坑的角儿。我一不小心就写挂了,重点是本机测试所有数据的输出结果都对。查不出来哪儿错的,,找了5min才找出来。

pair < int,int> *p=&q.front();然后就p->first p->second
改成
pair < int,int> p=q.front() p.first p.second
就AC了。(哎 讲语法课的时候浪过去了)
p是取的q.front()的地址,然后它pop出去了,相当于取了个随时都有可能变的地址,这虽然能水过本机的测试,但评测机就水不过去了。。。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,m,sx,sy,ex,ey,ansl,ansr,flag=0,Q,cases,vis[55][55];
char a[55][55],lx[]={-1,0,1,0},ly[]={0,1,0,-1},rx[]={1,0,-1,0},ry[]={0,1,0,-1};
inline void dfs(int x,int y,int f,int t,char *xx,char *yy){
    if(Q)return;
    if(a[x][y]=='E'){
        if(flag%2){ansr=t,flag++,Q=1;return;}
        else {ansl=t,flag++,Q=1;return;}
    }
    for(int i=0;i<=3;i++)
        if(a[x+xx[(f+i)%4]][y+yy[(f+i)%4]]=='.'||a[x+xx[(f+i)%4]][y+yy[(f+i)%4]]=='E')
            dfs(x+xx[(f+i)%4],y+yy[(f+i)%4],(f+i+3)%4,t+1,xx,yy);
}
int bfs(){
    queue<pair<int,int> >q;
    q.push(make_pair(sx,sy));
    while(1){
        pair<int,int>p=q.front();q.pop();
        if(a[p.first][p.second]=='E')return vis[p.first][p.second];
        for(int i=0;i<=3;i++)
        if(!vis[p.first+lx[i]][p.second+ly[i]]&&(a[p.first+lx[i]][p.second+ly[i]]=='.'||a[p.first+lx[i]][p.second+ly[i]]=='E'))
            vis[p.first+lx[i]][p.second+ly[i]]=vis[p.first][p.second]+1,q.push(make_pair(p.first+lx[i],p.second+ly[i]));
    }
}
int main(){
    scanf("%d",&cases);
    while(cases--){
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&m,&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
                if(a[i][j]=='S')sx=i,sy=j;
            }
        Q=0;dfs(sx,sy,0,1,lx,ly);
        Q=0;dfs(sx,sy,0,1,rx,ry);
        printf("%d %d %d
",ansl,ansr,bfs()+1);
    }
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532455.html