POJ 1729 Jack ans Jill(bfs)

原创 2016年08月31日 16:23:17

每次扩展最多可以扩展出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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj 1729 Jack and Jill (比较有特色的bfs)

Description Ever since the incident on the hill, Jack and Jill dislike each other and wish to remai...

poj 1729 Jack and Jill 1376 Robot 1324 Holedox Moving 1475 Pushing Boxes bfs + a*

poj 1729 Jack and JillJack和Jill要从各自的家走到各自的学校,但是他们俩各自不喜欢对方,因此,需要你找到两个人行走的路线,使得他们路线中两个人最近的直线距离最长。单位时间内...

POJ3026-Borg Maze【BFS+Prim】

  • 2011-07-30 18:36
  • 12KB
  • 下载

BJTU 1729 Ryan的弹幕游戏(BFS)

Ryan的弹幕游戏 Time Limit: 1000 MS    Memory Limit: 65535 Kb Total Submission: 8   ...

poj 1127 Jack Straws 几何 + 弗洛伊德

// poj 1127 Jack Straws 几何 + 弗洛伊德 // // 解题思路: // 两两之间,如果相连,则连一条边,最后用弗洛伊德求闭包. #include #include ...

poj 1127 Jack Straws

#include #include #include #define MAX_N 15 #define MAX_M 10005 double EPS=1e-10; //考虑误差的加法运算 double...

POJ 1127-Jack Straws(计算几何 线段相交)

Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4120   Ac...

poj 1127 Jack Straws 线段判交+并查集

Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3277   Ac...

poj--1127 Jack Straws

poj 1127题解 见《挑战程序设计竞赛》 #include #include #include #include #include using namespace std;doubl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)