POJ 1729 Jack ans Jill(bfs)
来源:互联网 发布:nginx加lua模块 编辑:程序博客网 时间:2024/05/24 06:07
每次扩展最多可以扩展出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;}
0 0
- POJ 1729 Jack ans Jill(bfs)
- POJ 1729 Jack and Jill BFS *
- poj 1729 Jack and Jill BFS嵌套,同时进行两个
- poj 1729 Jack and Jill (比较有特色的bfs)
- poj 1729 Jack and Jill 1376 Robot 1324 Holedox Moving 1475 Pushing Boxes bfs + a*
- [Android]Jack和Jill的阴暗面
- Android 新一代编译 toolchain Jack & Jill 简介
- Android 新一代编译 toolchain Jack & Jill 简介
- Android 新一代编译 toolchain Jack & Jill 简介
- Android最新编译工具Jack和Jill
- POJ1729 Jack and Jill (双向广度优先搜索, DBFS)
- poj 1127 Jack Straws(计算几何)
- POJ 3199 Uncle Jack(JAVA练习)
- POJ 1127 Jack Straws (计算几何)
- POJ 1127(Jack Straws )(线段相交)
- POJ 3199 Uncle Jack (高精度)
- POJ 1127 Jack Straws
- POJ 1992 Jack
- selenium之 富文本框和editor编辑器的处理
- ip netns命令操作docker容器的网络
- 快速上手RaphaelJS
- 设计模式:代理模式(Proxy)
- SQLite数据库的使用之使用内置函数
- POJ 1729 Jack ans Jill(bfs)
- QDU easy problem(另类枚举)
- C# 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接的错误
- LeetCode OJ-387. First Unique Character in a String
- spring框架中的定时器
- windows下Python连接Oracle
- CXTPReportView--VirtualList
- NS3系列—1———NS3中文教程:3下载及编译软件
- JavaScript的异步实现