POJ 1729 Jack ans Jill(bfs)

每次扩展最多可以扩展出16个结点,搞清楚这个就可以了,其它理解不难。

不过自己想还是想不出来,看的时候不下看懂了,还是要多想啊。

//
//  main.cpp
//  Richard
//
//  Created by 邵金杰 on 16/8/31.
//  Copyright © 2016年 邵金杰. All rights reserved.
//




#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=30+5;
const int maxn=1000000+10;
int vis[N][N][N][N];
int dist(int x,int y)
{
    return x*x+y*y;
}
int sx1,sy1,sx2,sy2,ex1,ey1,ex2,ey2;
struct node{
    int x1,y1,x2,y2,dis,d1,d2,pre,id;
    node() {}
    node(int x1,int y1,int x2,int y2,int dis): x1(x1),y1(y1),x2(x2),y2(y2),dis(dis) {}
    bool check(){
        if(check1()&&check2())
            return true;
        else
            return false;
    }
    bool check1(){
        if(x1==ex1&&y1==ey1)
            return true;
        else
            return false;
    }
    bool check2(){
        if(x2==ex2&&y2==ey2)
            return true;
        else
            return false;
    }
    bool operator < (const node &p) const {
        return dis<p.dis;
    }
}way[maxn];
int n;
char map[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
char dir[5]="NWSE";
void bfs()
{
    priority_queue<node> pq;
    memset(vis,-1,sizeof(vis));
    int dis=dist(sx1-sx2,sy1-sy2);
    node state(sx1,sy1,sx2,sy2,dis);
    int cnt=1;
    state.d1=-1;
    state.d2=-1;
    state.id=0;
    state.pre=-1;
    pq.push(state);
    way[0]=state;
    vis[sx1][sy1][sx2][sy2]=state.dis;
    node now,next;
    while(!pq.empty())
    {
        now=pq.top();
        pq.pop();
        if(now.check())
        {
            printf("%.2f\n",sqrt(1.0*now.dis));
            string s1="",s2="";
            node p=now;
            while(p.pre!=-1)
            {
                if(p.d1!='*'){
                    s1.push_back(p.d1);
                }
                if(p.d2!='*'){
                    s2.push_back(p.d2);
                }
                p=way[p.pre];
            }
            reverse(s1.begin(),s1.end());
            reverse(s2.begin(),s2.end());
            cout<<s1<<endl;
            cout<<s2<<endl;
            return ;
        }
        for(int i=0;i<4;i++)
        {
            int nx1=now.x1+dx[i];
            int ny1=now.y1+dy[i];
            int d1=dir[i];
            if(now.check1()){
                nx1=now.x1;
                ny1=now.y1;
                d1='*';
            }
            if(!map[nx1][ny1]||map[nx1][ny1]=='#'||map[nx1][ny1]=='*') ;
            else{
                for(int j=0;j<4;j++)
                {
                    int nx2=now.x2+dx[j];
                    int ny2=now.y2+dy[j];
                    int d2=dir[j];
                    if(now.check2()){
                        nx2=now.x2;
                        ny2=now.y2;
                        d2='*';
                    }
                    if(!map[nx2][ny2]||map[nx2][ny2]=='$'||map[nx2][ny2]=='*') ;
                    else{
                        int ndis=dist(nx1-nx2,ny1-ny2);
                        ndis=min(ndis,now.dis);
                        int vv=vis[nx1][ny1][nx2][ny2];
                        if(vv==-1||ndis>vis[nx1][ny1][nx2][ny2])
                        {
                            vis[nx1][ny1][nx2][ny2]=ndis;
                            next.x1=nx1;next.y1=ny1;
                            next.x2=nx2;next.y2=ny2;
                            next.d1=d1;next.d2=d2;
                            next.dis=ndis;
                            next.pre=now.id;
                            next.id=cnt;
                            way[cnt++]=next;
                            pq.push(next);
                        }
                    }
                }
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        memset(map,0,sizeof(map));
        for(int i=1;i<=n;i++)
        {
            scanf("%s",map[i]+1);
            char *p;
            p=strchr(map[i]+1,'H');
            if(p)
            {
                sx1=i;
                sy1=(int)(p-map[i]);
                map[sx1][sy1]='$';
            }
            p=strchr(map[i]+1,'S');
            if(p)
            {
                ex1=i;
                ey1=(int)(p-map[i]);
                map[ex1][ey1]='$';
            }
            p=strchr(map[i]+1,'h');
            if(p)
            {
                sx2=i;
                sy2=(int)(p-map[i]);
                map[sx2][sy2]='#';
            }
            p=strchr(map[i]+1,'s');
            if(p)
            {
                ex2=i;
                ey2=(int)(p-map[i]);
                map[ex2][ey2]='#';
            }
        }
        bfs();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值