poj 3083 Children of the Candy Corn (广搜,模拟,简单)

题目

 

靠墙走用 模拟,我写的是靠左走,因为靠右走相当于 靠左走从终点走到起点。

最短路径 用bfs。

 

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 110
char map[MAXN][MAXN];
int n,m;
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
struct tt
{
    int x,y,step;
};

int bfs(int x,int y,int x1,int y1)
{
    int ans=0,i;
    tt front,rear,temp;
    queue<tt>q;
    while(!q.empty())
        q.pop();
    front.x=x,front.y=y,front.step=0;
    ans=1;
    q.push(front);
    i=0;
    while(!q.empty())
    {
        temp=q.front();
        if(temp.x==x1&&temp.y==y1)return ans;
        q.pop();
        ans++;
        i=(i+3)%4;
        rear.x=temp.x+xx[i];
        rear.y=temp.y+yy[i];
        if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!='#')
        {
            q.push(rear);
        }
        else        
        for(;;i=(i+1)%4)
        {
            rear.x=temp.x+xx[i];
            rear.y=temp.y+yy[i];
            if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!='#')
            {
                q.push(rear);
                break;
            }    
        }
    }
    return ans;
}

int bfs1(int x,int y,int x1,int y1)
{
    tt front,rear,temp;
    queue<tt>q;
    while(!q.empty())
        q.pop();
    front.x=x,front.y=y,front.step=1;
    q.push(front);
    map[x][y]='#';
    while(!q.empty())
    {
        temp=q.front();
        if(temp.x==x1&&temp.y==y1)return temp.step;
        q.pop();
        for(int i=0;i<4;i++)
        {
            rear.x=temp.x+xx[i];
            rear.y=temp.y+yy[i];
            if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]!='#')
            {
                rear.step=temp.step+1;
                q.push(rear);
                map[rear.x][rear.y]='#';
            }    
        }
    }
    return 0;
}
int main()
{
    int i,t,j,sx,sy,ex,ey,a,b,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        for(i=0;i<n;i++)
        {
            scanf("%s",map[i]);
            for(j=0;j<m;j++)
            {
                if(map[i][j]=='S')
                {
                    sx=i;sy=j;
                }
                else if(map[i][j]=='E')
                {
                    ex=i;ey=j;
                }
            }
        }
        a=bfs(sx,sy,ex,ey);
        b=bfs(ex,ey,sx,sy);
        c=bfs1(sx,sy,ex,ey);
        printf("%d %d %d\n",a,b,c);
    }    
    return 0;
}
View Code

 

posted @ 2014-02-14 23:31  laiba2004  Views(126)  Comments(0Edit  收藏  举报