POJ 3083 BFS+DFS 40行

来源:互联网 发布:网络吐槽类脱口秀节目 编辑:程序博客网 时间:2024/05/16 16:21

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

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

此题 知道了思路以后就是水题了。。。。
再随便缩缩行也就不到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\n",ansl,ansr,bfs()+1);    }}

这里写图片描述

0 0
原创粉丝点击