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 rema...
  • Little_boy_z
  • Little_boy_z
  • 2017年11月02日 17:13
  • 59

poj1729(bfs+优先队列优化)

Jack and Jill Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1502   Accepted: 39...
  • update7
  • update7
  • 2017年07月29日 21:20
  • 17616

POJ1312 棋盘问题 BFS

#include #include char map[15][15]; int visit[15]; int n,k; int ans; void dfs(int x,int c) { int...
  • Arthur_Holmes
  • Arthur_Holmes
  • 2016年10月29日 20:00
  • 205

poj3984(迷宫问题)(bfs和队列)

嘿嘿,如果这道题是求最短的步数,那么用BFS算法就可以了。但是因为还要输出路径,可能还要保存每个结点的上一个结点的坐标,最后再用递归或是迭代的方法逆序输出坐标,博主昨天学会了bfs算法表示真的很高兴,...
  • u014616233
  • u014616233
  • 2014年04月10日 00:03
  • 1772

hdu 1254 推箱子/poj 1475 Pushing Boxes(推箱子经典问题,BFS嵌套BFS)

推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm...
  • acm_cxq
  • acm_cxq
  • 2016年08月04日 22:12
  • 757

Android最新编译工具Jack和Jill

前几天在编译Android6.0系统的时候,报了一个ERROR: Security problem, see Jack server log的错误,就顺便查了一些资料,简单了解了一下Jack并总结如下...
  • Simon_Crystin
  • Simon_Crystin
  • 2017年03月16日 16:31
  • 1393

poj 3414 Pots(广搜BFS+路径输出)

poj3414 Pots(BFS+路径输出)
  • u012860063
  • u012860063
  • 2014年07月14日 20:18
  • 1854

Android的Jack编译器试用

最近在8核(Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz)、64GB内存服务器下编译的Android 6.0时,发现在仅开了四个编译任务(make -j 4)的情况...
  • alien75
  • alien75
  • 2016年05月17日 11:59
  • 6926

百练6044--鸣人与佐助(BFS)

题目大意:又是迷宫啊迷宫啊。鸣人救佐助,一开始手上有一定数量的查克拉,路上遇见大蛇丸的手下,需要耗费一个查克拉杀死对方,才能继续走,然而鸣人能够瞬杀,不耗费时间,只消耗移动距离的时间。没有查克拉,就要...
  • hhhhhhj123
  • hhhhhhj123
  • 2015年07月26日 20:58
  • 1320

POJ3984迷宫问题(BFS+队列+栈)

POJ-3984-迷宫问题 http://poj.org/problem?id=3984 大概思路:进行普通的BFS,用队列来操作。在保存路径的时候,可以用栈来输出路径,利用先进后出的特性。...
  • Seawindson
  • Seawindson
  • 2016年07月11日 13:20
  • 437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1729 Jack ans Jill(bfs)
举报原因:
原因补充:

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