poj 3083 Children of the Candy Corn(搜索)

http://poj.org/problem?id=3083

题意:迷宫沿着左墙走,和沿着右强的距离以及最短路径的距离分别是多少,当向左走的时候1的位置就是面向左,向右走1的位置面向右,这样可以省去很多事

分析:DFS+BFS

         先确定前一位置的方向,再决定下一位置是朝哪个方向旋转

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int MAXN=50;
int m,n;
int flag,ans1,ans2,ans3;
char map[MAXN][MAXN];
int cnt[MAXN][MAXN];
int vis[MAXN][MAXN];
struct Node
{
    int x,y;
} s,e;

void DFS_L(int x,int y,int step,int face)
{
    if(flag) return ;
    if(x==e.x && y==e.y)
    {
        ans1=step;
        flag=1;
        return ;
    }
    switch(face)
    {
    case 1://左
        if(map[x+1][y]) DFS_L(x+1,y,step+1,4);
        else if(map[x][y-1]) DFS_L(x,y-1,step+1,1);
        else if(map[x-1][y]) DFS_L(x-1,y,step+1,2);
        else if(map[x][y+1]) DFS_L(x,y+1,step+1,3);
        break;
    case 2://上
        if(map[x][y-1]) DFS_L(x,y-1,step+1,1);
        else if(map[x-1][y]) DFS_L(x-1,y,step+1,2);
        else if(map[x][y+1]) DFS_L(x,y+1,step+1,3);
        else if(map[x+1][y]) DFS_L(x+1,y,step+1,4);
        break;
    case 3://右
        if(map[x-1][y]) DFS_L(x-1,y,step+1,2);
        else if(map[x][y+1]) DFS_L(x,y+1,step+1,3);
        else if(map[x+1][y]) DFS_L(x+1,y,step+1,4);
        else if(map[x][y-1]) DFS_L(x,y-1,step+1,1);

    case 4://下
        if(map[x][y+1]) DFS_L(x,y+1,step+1,3);
        else if(map[x+1][y]) DFS_L(x+1,y,step+1,4);
        else if(map[x][y-1]) DFS_L(x,y-1,step+1,1);
        else if(map[x-1][y]) DFS_L(x-1,y,step+1,2);
        break;
    }
}

void DFS_R(int x,int y,int step,int face)
{
    if(flag) return ;
    if(x==e.x && y==e.y)
    {
        ans2=step;
        flag=1;
        return ;
    }
    switch(face)
    {
    case 1://右
        if(map[x+1][y]) DFS_R(x+1,y,step+1,4);
        else if(map[x][y+1]) DFS_R(x,y+1,step+1,1);
        else if(map[x-1][y]) DFS_R(x-1,y,step+1,2);
        else if(map[x][y-1]) DFS_R(x,y-1,step+1,3);
        break;
    case 2://上
        if(map[x][y+1]) DFS_R(x,y+1,step+1,1);
        else if(map[x-1][y]) DFS_R(x-1,y,step+1,2);
        else if(map[x][y-1]) DFS_R(x,y-1,step+1,3);
        else if(map[x+1][y]) DFS_R(x+1,y,step+1,4);
        break;
    case 3://左
        if(map[x-1][y]) DFS_R(x-1,y,step+1,2);
        else if(map[x][y-1]) DFS_R(x,y-1,step+1,3);
        else if(map[x+1][y]) DFS_R(x+1,y,step+1,4);
        else if(map[x][y+1]) DFS_R(x,y+1,step+1,1);

    case 4://下
        if(map[x][y-1]) DFS_R(x,y-1,step+1,3);
        else if(map[x+1][y]) DFS_R(x+1,y,step+1,4);
        else if(map[x][y+1]) DFS_R(x,y+1,step+1,1);
        else if(map[x-1][y]) DFS_R(x-1,y,step+1,2);
        break;
    }
}


int BFS()
{
    int i;
    queue<Node> Q;
    Q.push(s);
    Node head,next;
    while(!Q.empty())
    {
        head=Q.front();
        Q.pop();

        if(!vis[head.x-1][head.y] && map[head.x-1][head.y])
        {
            next.x=head.x-1;
            next.y=head.y;
            Q.push(next);
            vis[next.x][next.y]=1;
            cnt[next.x][next.y]=cnt[head.x][head.y]+1;
        }
        if(!vis[head.x+1][head.y]&& map[head.x+1][head.y])
        {
            next.x=head.x+1;
            next.y=head.y;
            Q.push(next);
            vis[next.x][next.y]=1;
            cnt[next.x][next.y]=cnt[head.x][head.y]+1;
        }
        if(!vis[head.x][head.y-1]&& map[head.x][head.y-1])
        {
            next.x=head.x;
            next.y=head.y-1;
            Q.push(next);
            vis[next.x][next.y]=1;
            cnt[next.x][next.y]=cnt[head.x][head.y]+1;
        }
        if(!vis[head.x][head.y+1] && map[head.x][head.y+1])
        {
            next.x=head.x;
            next.y=head.y+1;
            Q.push(next);
            vis[next.x][next.y]=1;
            cnt[next.x][next.y]=cnt[head.x][head.y]+1;
        }
        vis[head.x][head.y]=1;
        if(e.x==head.x && e.y==head.y) return cnt[head.x][head.y];
    }
    return cnt[head.x][head.y];
}

int main()
{
    int T,i,j;
    scanf("%d",&T);
    while(T--)
    {
        memset(map,0,sizeof(map));
        scanf("%d%d",&m,&n);
        for(i=1; i<=n; i++)
        {
            scanf("%s",map[i]+1);
            for(j=1; map[i][j]; j++)
            {
                if(map[i][j]=='.') map[i][j]=1;
                else if(map[i][j]=='#') map[i][j]=0;
                if(map[i][j]=='S')
                {
                    s.x=i;
                    s.y=j;
                    map[i][j]=1;
                }
                else if(map[i][j]=='E')
                {
                    e.x=i;
                    e.y=j;
                    map[i][j]==1;
                }
            }
        }
        flag=0;
        DFS_L(s.x,s.y,1,1);
        flag=0;
        DFS_R(s.x,s.y,1,1);
        memset(cnt,0,sizeof(cnt));
        memset(vis,0,sizeof(vis));
        ans3=BFS();
        printf("%d %d %d\n",ans1,ans2,ans3+1);
    }
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | 谷歌与MIT联袂巨著:《计算机科学的数学》开放下载

选自CSAIL.Mit 机器之心编译 参与:蒋思源、吴攀 谷歌和麻省理工学院联袂出品的《计算机科学的数学》昨日已经开放下载了,读者可点击文末「阅读原文」下载。...

3097
来自专栏一棹烟波

AVFrame转换到Mat,yuv420p转换到RGB源代码

FFmpeg中AVFrame到OpenCV中Mat的两种转换方法 方法一:查表法 void AVFrame2Img(AVFrame *pFrame, cv::M...

7726
来自专栏程序生活

第三周编程作业-Planar data classification with one hidden layerPlanar data classification with one hidden l

Planar data classification with one hidden layer Welcome to your week 3 programm...

1K10
来自专栏wym

HDU 3018 Ant Trip(欧拉回路)

#include <bits/stdc++.h> using namespace std; const int N=100005; int f[N]; ...

882
来自专栏专知

UAI 2018大会论文接受列表新鲜出炉

【导读】UAI大会全称为Conference on Uncertainty in Artificial Intelligence,立足于不确定性人工智能领域,主...

1945
来自专栏ml

HDUOJ--8球胜负

8球胜负 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java...

3579
来自专栏CreateAMind

Suggested Education for Future AGI Researchers

https://sites.google.com/site/narswang/home/agi-introduction/agi-education

1062
来自专栏wym

欧拉路和欧拉回路理论基础

   欧拉路是指从图中任意一点开始到任意一点结束的路径,并且图中每条边通过且只通过一次。也即可以一笔画出。

992
来自专栏测试开发架构之路

分享一本关于稀疏信号处理的书给大家,也是我曾读过的教材[附下载链接]

Sparse Signal Processing 作者/authors M Azghani, F Marvasti 摘要/abstract Convention...

3507
来自专栏ml

HDUOJ -----1864 最大报销额(动态规划)

最大报销额 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav...

2964

扫码关注云+社区

领取腾讯云代金券