zoukankan      html  css  js  c++  java
  • csu 1604 SunnyPig (bfs)

    Description

    SunnyPig is a pig who is much cleverer than any other pigs in the pigpen. One sunny morning, SunnyPig wants to go out of the pigpen to date Mrs. Snail, his beloved. However, it’s terribly tough for a pig to go out of the pigpen because the pigpen is divided into m * n grids with fences which pigs cannot go across. Luckily, there are some doors unlocked on the fences so that SunnyPig can push them open with his nose. Since SunnyPig is a pig, no matter how clever he is, he can never walk upright like human beings. As a result, SunnyPig is not able to pull any doors. Now give you the map of the pigpen, please calculate the fewest number of doors SunnyPig should push to go out of the pigpen.

     

    Input

    The first line there is a number T (0 < T < 100), denoting the number of the test case. The first line of each test case has only two numbers: m, n. The following 2*m+1 lines describe the pigpen. Each line has 2*n+1 characters. ’*’ represents a cross point of two fences. ’O’ represents the initial position SunnyPig. ’-’ and ‘|’ represent fences without doors. ’N’, ’S’, ’W’, ’E’ represent the doors SunnyPig can push in the direction of north, south, west and east respectively. And the character of a space represents the place where SunnyPig can go through.

     

    Output

    Output the fewest number of doors SunnyPig should push to go out of the pigpen, in other words, the fewest number of doors SunnyPig should push to go out of the border of these grids. If SunnyPig cannot go out of the pigpen, output -1. Each case, a single line.

     

    Sample Input

    2
    3 3
    *-*N*-*
    |O| E E
    *S*S*-*
    W | E |
    *-*S*N*
    W W E |
    *N*S*N*
    4 2
    *N*S*
    E | W
    *S*S*
    EOW W
    *-*N*
    | W E
    *-*S*
    W E |
    *S*S*

    Sample Output

    2
    -1

    此题是裸的bfs,重点留意 开门方向的判断 暑期训练赛3 A题 有坑点 不能用getchar;
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<stack>
    #include<queue>
    #include<vector>
    using namespace std;
    int m,n;
    char mp[2005][2005];
    int dis[4][2]= {{1,0},{-1,0},{0,-1},{0,1}};
    char ch[4]={'S','N','W','E'};
    struct node
    {
        int x;
        int y;
        int tim;
    };
    queue<node> q;
    node now,ww;
    int sx,sy;
    int bfs(int xx,int yy)
    {
        while(!q.empty())
            q.pop();
        now.x=xx;
        now.y=yy;
        now.tim=0;
        mp[xx][yy]='2';
        q.push(now);
        while(!q.empty())
        {
            now=q.front();
            q.pop();
            //cout<<now.x<<now.y<<endl;
            if(now.x==0||now.x==2*(m+1)||now.y==0||now.y==2*(n+1))
                return now.tim;
            for(int i=0; i<=3; i++)
            {
                //cout<<"****"<<endl;
                int s1=now.x+dis[i][0];
                int s2=now.y+dis[i][1];
                if(s1>=0&&s1<=2*(m+1)&&s2>=0&&s2<=2*(n+1)&&(mp[s1][s2]=='1'||mp[s1][s2]==' '||mp[s1][s2]==ch[i]))
                {
    
                    if(mp[s1][s2]==ch[i])
                        ww.tim=now.tim+1;
                    else
                        ww.tim=now.tim;
                    ww.x=s1;
                    ww.y=s2;
                    mp[s1][s2]='2';
                    q.push(ww);
                }
            }
    
        }
        return -1;
    }
    int main()
    {
        int t;
        while(scanf("%d",&t)!=EOF)
        {
            for(int i=1; i<=t; i++)
            {
                memset(mp,0,sizeof(mp));
                scanf("%d%d",&m,&n);
                for(int j=0; j<=2*m+2; j++)
                {
                    for(int k=0; k<=2*n+2; k++)
                    {
                        if(j==0||j==2*(m+1)||k==0||k==2*(n+1))
                            mp[j][k]='1';
                        else
                        {
                            scanf("%c",&mp[j][k]);
                            if(mp[j][k]=='O')
                            {
                                sx=j;
                                sy=k;
                            }
                        }
                    }
                    char ke[2];
                    if(j!=2*m+2)
                        gets(ke);//用getchar 就wa  有坑点
                }
                cout<<bfs(sx,sy)<<endl;
    
            }
        }
        return 0;
    }
    
    
    
    
    
    
  • 相关阅读:
    红旗桌面版本最新行使方法和效果解答100例4
    红旗桌面版本最新运用行为和标题问题解答100例3
    红旗桌面版本最新运用方式和成效解答100例2
    Linux下Resin JSP MySQL的部署和设置配备铺排2
    在Linux下Turbomail简易快捷的装置体式格局
    企业级Linux红旗桌面版可以可能登岸日本
    从红旗5.0说起——看Linux的内存管理
    红旗Linux桌面4.1文本布置过程图解(一)
    Linux下Resin JSP MySQL的装置和设置装备安排1
    Ubuntu 8.04中竖立Apache PHP MySQL基本环境
  • 原文地址:https://www.cnblogs.com/hsd-/p/4676785.html
Copyright © 2011-2022 走看看