• poj 3083 Children of the Candy Corn 夜


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

    题目不难 就是繁琐呀

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    #include<set>
    #include<map>
    #include<string>
    #include<queue>
    #include<stack>
    #include <iomanip>
    using namespace std;
    #define LL long long
    #define sint short int
    const int INF=0x3f3f3f3f;
    //priority_queue<int,vector<int>,greater<int> >qt;
    const int N=50;
    char graph[N][N];
    typedef pair<int,int>point;
    queue<point>qt;
    int dist[N][N];
    bool in[N][N];
    int X[]={-1,0,1,0};
    int Y[]={0,1,0,-1};
    int n,m;
    bool OK(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m&&graph[x][y]!='#')
        return true;
        return false;
    }
    int spfa(int sx,int sy,int ex,int ey)
    {
        memset(in,false,sizeof(in));
        memset(dist,-1,sizeof(dist));
        qt.push(point(sx,sy));
        in[sx][sy]=true;
        dist[sx][sy]=1;
        while(!qt.empty())
        {
            int x=qt.front().first;
            int y=qt.front().second;
            in[x][y]=false;
            qt.pop();
            for(int i=0;i<4;++i)
            {
                int l1=x+X[i];
                int l2=y+Y[i];
                if(OK(l1,l2)&&(dist[l1][l2]==-1||dist[l1][l2]>dist[x][y]+1))
                {
                   dist[l1][l2]=dist[x][y]+1;
                   if(!in[l1][l2])
                   {
                       in[l1][l2]=true;
                       qt.push(point(l1,l2));
                   }
                }
            }
        }
        return dist[ex][ey];
    }
    int Lsearch(int sx,int sy,int ex,int ey,int t)
    {
        int step=1;
        int kx=sx,ky=sy;
        while(true)
        {
            if(kx==ex&&ky==ey)
            break;
            bool flag=false;
            for(int i=(t+3)%4,j=0;j<4;++j,i++)
            {
                int l=(i+4)%4;
                int l1=kx+X[l];
                int l2=ky+Y[l];
                if(OK(l1,l2))
                {kx=l1;ky=l2;t=l;++step;flag=true;break;}
            }
            if(flag==false)
            return INF;
        }
        return step;
    }
    int Rsearch(int sx,int sy,int ex,int ey,int t)
    {//cout<<kx<<" "<<ky<<" "<<t<<endl;
        int step=1;
        int kx=sx,ky=sy;
        while(true)
        {//cout<<kx<<" "<<ky<<" "<<t<<endl;
            if(kx==ex&&ky==ey)
            break;
            bool flag=false;
            for(int i=(t+1)%4,j=0;j<4;++j,i--)
            {
                int l=(i+4)%4;
                int l1=kx+X[l];
                int l2=ky+Y[l];
                if(OK(l1,l2))
                {kx=l1;ky=l2;t=l;++step;flag=true;break;}
            }
            if(flag==false)
            return INF;
        }
        return step;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int sx,sy,ex,ey;
            scanf("%d %d",&m,&n);
            getchar();
            for(int i=0;i<n;++i)
            gets(graph[i]);
            for(int i=0;i<n;++i)
            for(int j=0;j<m;++j)
            if(graph[i][j]=='S')
            {sx=i;sy=j;}
            else if(graph[i][j]=='E')
            {ex=i;ey=j;}
            int ans1=INF,ans2=INF,ans3;
            //cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
            for(int i=0;i<4;++i)
            {
                ans1=min(ans1,Lsearch(sx,sy,ex,ey,i));
                ans2=min(ans2,Rsearch(sx,sy,ex,ey,i));
            }
            ans3=spfa(sx,sy,ex,ey);
            printf("%d %d %d\n",ans1,ans2,ans3);
        }
        return 0;
    }
    

      

  • 相关阅读:
    认识弹性盒子
    管理Linux服务器的用户和组(续篇)
    管理Linux服务器的用户和组
    centos7 mysql数据库安装和配置
    熟练使用Linux进程管理类命令
    熟练使用Linux系统信息类命令
    Linux操作系统-基本命令(二)
    Linux操作系统-基本命令(一)
    api接口统一封装
    10分钟,让你彻底明白Promise原理
  • 原文地址:https://www.cnblogs.com/liulangye/p/2803875.html
Copyright © 2020-2023  润新知