zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    R语言 主成分分析
    主成分分析(PCA)及其在R里的实现
    UML类图几种关系的总结
    微信Android客户端架构演进之路
    Android单元测试实践
    Android studio 快捷键(Mac)
    Android 启动模式及常用的Intent的Flag
    linux常用命令 (mac ),积少成多
    Android Studio IDE 简单学习和介绍
    轻量级分布式 RPC 框架
  • 原文地址:https://www.cnblogs.com/yu0111/p/5392510.html
Copyright © 2011-2022 走看看