0x25 广度优先搜索
今天莫名不想说话。
结果发现效率挺高?
poj3322 本来可以1a的。。发现我宽搜写的是head<=tail而且初始是head=1,tail=2如果是多组数据简直就gg了。基础不牢固
这题虽然看起来麻烦,但是实际上仔细思考一下是不难推出对于各种不同放在地图上的方式分别表示的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={-,,,};
const int dy[]={,-,,}; int n,m;
char ss[][];
struct node
{
int x,y,l,c;
}list[];
bool check(int x,int y){return <x&&x<=n&&<y&&y<=m&&ss[x][y]!='#';} bool v[][][];
int main()
{
int stx,sty,stl,edx,edy,edl;bool sb;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break; sb=false;
for(int i=;i<=n;i++)scanf("%s",ss[i]+);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
if(ss[i][j]=='X'&&sb==false)
{
sb=true;
stx=i, sty=j;
if(ss[i+][j]=='X')stl=;
else if(ss[i][j+]=='X')stl=;
else stl=;
}
else if(ss[i][j]=='O') edx=i, edy=j;
}
memset(v,false,sizeof(v));
for(int i=;i<=;i++)list[i].x=list[i].y=list[i].l=list[i].c=;
list[].x=stx;list[].y=sty;list[].l=stl;list[].c=;
int head=,tail=;
while(head<=tail)
{
if(list[head].x==edx&&list[head].y==edy&&list[head].l==)
{
printf("%d\n",list[head].c);
break;
} for(int k=;k<=;k++)
{
node tno=list[head];tno.c++;
if(tno.l==)
{
tno.x+=dx[k]<?dx[k]*:dx[k];
tno.y+=dy[k]<?dy[k]*:dy[k];
tno.l=dx[k]==?:;
}
else if(tno.l==)
{
tno.x+=dx[k]>?dx[k]*:dx[k];
tno.y+=dy[k];
tno.l=dx[k]==?:;
}
else if(tno.l==)
{
tno.x+=dx[k];
tno.y+=dy[k]>?dy[k]*:dy[k];
tno.l=dy[k]==?:;
} if(check(tno.x,tno.y))
{
if(tno.l==&&ss[tno.x][tno.y]=='E')continue;
if(tno.l==&&!check(tno.x+,tno.y))continue;
if(tno.l==&&!check(tno.x,tno.y+))continue;
if(v[tno.x][tno.y][tno.l]==false)
{
v[tno.x][tno.y][tno.l]=true;
list[tail]=tno;
tail++;
}
}
}
head++;
}
if(!v[edx][edy][])printf("Impossible\n");
}
return ;
}
poj3322
bzoj2252 又是gb权限题。。可以说是相当简单,让1去找0,直到全图被访问过
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={-,,,};
const int dy[]={,-,,}; struct node
{
int x,y;
}list[];
int d[][]; char ss[];
int main()
{
int n,m,cnt;
scanf("%d%d",&n,&m);cnt=n*m; int head=,tail=;
memset(d,-,sizeof(d));
for(int i=;i<=n;i++)
{
scanf("%s",ss+);
for(int j=;j<=m;j++)
{
if(ss[j]=='')
{
d[i][j]=;
list[tail].x=i,list[tail].y=j;
tail++;
}
}
} while(head<=tail)
{
int x=list[head].x,y=list[head].y;
for(int k=;k<=;k++)
{
int tx=x+dx[k],ty=y+dy[k];
if(<tx&&tx<=n&&<ty&&ty<=m&&d[tx][ty]==-)
{
d[tx][ty]=d[x][y]+;
list[tail].x=tx,list[tail].y=ty;
tail++;
}
}
head++;
} for(int i=;i<=n;i++)
{
for(int j=;j<m;j++)
printf("%d ",d[i][j]);
printf("%d\n",d[i][m]);
}
return ;
}
bzoj2252
poj1475 码量大而且麻烦,这种题是需要沉下心做的。先bfs让人到箱子周边,再让箱子bfs,实际上就是bfs套bfs,人和箱子绑成一块,记得算答案是有四种不同情况的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[]={-,,,};
const int dy[]={,-,,};
const char ch[]={'N','W','S','E'}; int n,m;
char sc[][];
struct node
{
int x,y,k;
}list[];
int d[][][],f[][][];
char ss[][][][]; int xx[],yy[];
int E[][];
char sd[][][];
bool check(int x,int y){return <x&&x<=n&&<y&&y<=m&&sc[x][y]!='#';}
int getdis(int stx,int sty,int edx,int edy,int k)
{
memset(E,-,sizeof(E));
xx[]=stx,yy[]=sty;E[stx][sty]=;
int head=,tail=;
while(head<tail)
{
int x=xx[head],y=yy[head];
if(x==edx&&y==edy)return E[x][y];
for(int i=;i<=;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(check(tx,ty)&&(tx!=edx+dx[k]||ty!=edy+dy[k])&&E[tx][ty]==-)
{
for(int o=;o<=E[x][y];o++)sd[tx][ty][o]=sd[x][y][o];
sd[tx][ty][E[x][y]+]=ch[i]+;
E[tx][ty]=E[x][y]+; xx[tail]=tx,yy[tail]=ty;
tail++;
}
}
head++;
}
return -;
}
int main()
{
// freopen("a.out","w",stdout);
int T_T=;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)break;
printf("Maze #%d\n",++T_T); int stpx,stpy,stbx,stby,edx,edy;
for(int i=;i<=n;i++)
{
scanf("%s",sc[i]+);
for(int j=;j<=m;j++)
if(sc[i][j]=='S') stpx=i, stpy=j;
else if(sc[i][j]=='B') stbx=i, stby=j;
else if(sc[i][j]=='T') edx=i, edy=j;
} int head=,tail=;
memset(d,-,sizeof(d));
for(int i=;i<=;i++)
{
int ux=stbx+dx[i],uy=stby+dy[i];
if(check(ux,uy))
{
int dis=getdis(stpx,stpy,ux,uy,(i+)%);
if(dis==-)continue; for(int o=;o<=dis;o++)ss[stbx][stby][i][o]=sd[ux][uy][o];
d[stbx][stby][i]=;
f[stbx][stby][i]=dis; list[tail].x=stbx,list[tail].y=stby,list[tail].k=i;
tail++;
}
}
bool bk=false;int id=-,cnt=;
while(head<tail)
{
int x=list[head].x,y=list[head].y,k=list[head].k;
if(x==edx&&y==edy)
{
if(id==-||(d[x][y][k]<d[x][y][id]||(d[x][y][k]==d[x][y][id]&&f[x][y][k]<f[x][y][id])))
{
id=k;
cnt++;if(cnt==)break;
bk=true;
}
} int px=x+dx[k],py=y+dy[k];
for(int i=;i<=;i++)
{
int ux=x+dx[i],uy=y+dy[i];
int tx=x-dx[i],ty=y-dy[i];
if(check(tx,ty)&&check(ux,uy)&&(d[tx][ty][i]==-||d[x][y][k]+==d[tx][ty][i]))
{
int dis=getdis(px,py,ux,uy,(i+)%);
if(dis==-||(d[x][y][k]+==d[tx][ty][i]&&f[x][y][k]+dis>=f[tx][ty][i]))continue; int tot=d[x][y][k]+f[x][y][k];
for(int o=;o<=tot;o++)ss[tx][ty][i][o]=ss[x][y][k][o];
for(int o=;o<=dis;o++)ss[tx][ty][i][tot+o]=sd[ux][uy][o];
ss[tx][ty][i][tot+dis+]=ch[(i+)%]; d[tx][ty][i]=d[x][y][k]+;
f[tx][ty][i]=f[x][y][k]+dis; list[tail].x=tx,list[tail].y=ty,list[tail].k=i;
tail++;
}
}
head++;
}
if(bk==false)printf("Impossible.\n\n");
else
{
for(int o=;o<=d[edx][edy][id]+f[edx][edy][id];o++)printf("%c",ss[edx][edy][id][o]);
printf("\n\n");
}
}
return ;
}
poj1475
0x25 广度优先搜索的更多相关文章
- 图的广度优先搜索(BFS)
把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...
- ACM题目————图的广度优先搜索
题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...
- SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...
- HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1242 Rescue (BFS(广度优先搜索))
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜 ...
随机推荐
- insert into 语句的三种写法 以及批量插入
方式1. INSERT INTO t1(field1,field2) VALUE(v001,v002); // 插入一条 方式2. INSERT INTO t1(field1,f ...
- poj 1161 Floyd+枚举
题意是: 给出n个点,围成m个区域.从区域到另一个区域间需穿过至少一条边(若两区域相邻)——边连接着两点. 给出这么一幅图,并给出一些点,问从这些点到同一个区域的穿过边数最小值. 解题思路如下: 将区 ...
- 利用@factory和@dataProvider实现参数化
利用构造函数将要用的的参数初始化,非常有利于简化脚本.它将外部的数据赋给本地的变量,可以使得初始化后的参数被其他方法使用.直接上代码: private String url; private S ...
- Oracle性能优化——总体介绍
最近参加Oracle的培训,对Oracle有了更加深入的认识,在此做个学习总结. 1.Oracle数据库调优不能仅指望修改几项数据库参数就能有明显效果,问题更多出在应用方面,教育开发者正确地使用数据库 ...
- JAVA课设——中药古籍《太平圣惠方》数据处理与分析系统
一.配置JAVA环境 本次课设是在Windows 10(64bit)平台上实现的,所以首先得配置下JAVA环境. 步骤一:先下载一个JDK(1.7)安装包,安装好JDK: 步骤二:JDK环境配置(由于 ...
- css3 边框、背景、文本效果
浅玩CSS3 边框.背景.文本效果 一.边框 box-shadow box-shadow: h-shadow v-shadow blur spread color inset(ontset); //h ...
- Tomcat应用通过Nat123部署到外网(Tomcat+Nat123)
这里吐槽下,我先想到的方式是用花生壳域名解析,但是花生壳坑太多不易新手操作,用户体验做的不好.然后度娘后才知道有Nat123这个比花生壳简易操作的软件. 1.到nat123官网下载客户端 http: ...
- 7 Python+Selenium浏览器设置
[环境信息] python3.6+selenium3.0.2+Firefox50.0+win7 [浏览器设置方法] 1.浏览器最大化:maximize_window() 2.设置浏览器宽.高:set_ ...
- JS 蓝球弹起的高度 100 米 第几次高度小于1米
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- `itchat`配置代理
config.py配置 首先,先找到itchat安装的目录,然后定位到config.py文件: import os, platform VERSION = '1.3.10' BASE_URL = 'h ...