poj 3083 Children of the Candy Corn DFS+BFS

题意:

按照靠左走,靠右走以及最短路径的规则求从S点出发到E点的距离

方向有点难,因为当你改变方向的时候,下一步的方向也就随之改变了;

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 100
using namespace std;
int n,m,ex,ey,sx,sy;
char str[N][N];
int map[N][N];
int d[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int leftdfs(int x,int y,int ans,int p)
{
    int i;
    if(x==ex&&y==ey) {
        cout<<ans<<' ';
        return true;
    }
    for(i=0; i<4; i++) {
        int np=(i+p+3)%4;/*按左走是左上右下的顺序*/
        int nx=x+d[np][0],ny=y+d[np][1];
        if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#')
            continue;
        if(leftdfs(nx,ny,ans+1,np))
            return true;
    }
    return false;
}
int rightdfs(int x,int y,int ans,int p)
{
    int i;
    if(x==ex&&y==ey) {
        cout<<ans<<' ';
        return true;
    }
    for(i=3; i>=0; i--) {
        int np=(i+2+p)%4;/*按右走是右上左下*/
        int nx=x+d[np][0],ny=y+d[np][1];
        if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#')
            continue;
        if(rightdfs(nx,ny,ans+1,np))
            return true;
    }
    return false;
}
void bfs(int x,int y)
{
    int i,j;
    for(i=0; i<N; i++)
        for(j=0; j<N; j++)
            map[i][j]=0;
    typedef pair<int,int> P;
    queue <P>q;
    q.push(P(x,y));
    map[sx][sy]=1;
    while(q.size()) {
        P f=q.front();
        q.pop();
        if(f.first==ex&&f.second==ey) {
            cout<<map[ex][ey]<<endl;
            return;
        }
        for(i=0; i<4; i++) {
            int nx=f.first+d[i][0],ny=f.second+d[i][1];
            if(nx<0||nx>=n||ny<0||ny>=m||str[nx][ny]=='#'||map[nx][ny])/*第一遍的时候忘了检查map[nx][ny]是否遍历过TLE*/
                continue;
            q.push(P(nx,ny));
            map[nx][ny]=map[f.first][f.second]+1;
        }
    }
}
int main()
{
    int t,i;
    cin>>t;
    while(t--) {
        ex=ey=sx=sy=-1;
        scanf("%d%d%*c",&m,&n);
        int p=0;
        for(i=0; i<n; i++) {
            scanf("%s",str[i]);
            for(int j=0; j<m; j++) {
                if(sx!=-1&&ex!=-1)
                    break;
                if(str[i][j]=='S') 
                    sx=i,sy=j;
                else if(str[i][j]=='E')
                    ex=i,ey=j;
            }
        }
        leftdfs(sx,sy,1,0);
        rightdfs(sx,sy,1,0);
        bfs(sx,sy);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yu0111/p/5392510.html