SPOJ LAS(BFS)题解
题目:VJ
思路:
BFS+回溯,但是要剪枝,看了dalao的题解,超时+WA无数发,终于过了
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<queue>
#include<cmath>
//#include<map>
#include<string>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
const int N=300;
using namespace std;
char map[N][N];
char dir[N][N];
int vis[N][N],fx[N][N],fy[N][N];
int n,m,sx,sy,ex,ey,to[4][2]={1,0,-1,0,0,1,0,-1};
char turn[4]={'d','u','r','l'};
struct node{
int x,y;
int step;
int i;
};
queue<node> q;
void init(){
memset (vis,-1,sizeof(vis));
while(!q.empty()) q.pop();
}
int judge(int x,int y,int step){
if(x>=1 && x<=n && y>=1 && y<=m && map[x][y]!='#' && (vis[x][y]==-1 || vis[x][y]==step)) return 1;
return 0;
}
void add(int x,int y,int i,int step){
node a;
x+=to[i][0];
y+=to[i][1];
while(judge(x,y,step)){
if(vis[x][y]!=step){
dir[x][y]=turn[i];
vis[x][y]=step;
fx[x][y]=x-to[i][0];
fy[x][y]=y-to[i][1];
a.i=i;
a.x=x;
a.y=y;
a.step=step;
q.push(a);
}
x+=to[i][0];
y+=to[i][1];
}
}
void paint(int i){
int x,y,tx,ty;
tx=fx[ex][ey];
ty=fy[ex][ey];
x=ex;
y=ey;
while(tx!=sx || ty!=sy){
char wh=dir[tx][ty];
char go=dir[x][y];
if(wh!=go){
if(wh=='u'){
if(go=='l'){
map[tx][ty]='\\';
}
else if(go=='r'){
map[tx][ty]='/';
}
}
else if(wh=='d'){
if(go=='r'){
map[tx][ty]='\\';
}
else if(go=='l'){
map[tx][ty]='/';
}
}
else if(wh=='l'){
if(go=='u'){
map[tx][ty]='\\';
}
else if(go=='d'){
map[tx][ty]='/';
}
}
else if(wh=='r'){
if(go=='d'){
map[tx][ty]='\\';
}
else if(go=='u'){
map[tx][ty]='/';
}
}
}
x=tx;
y=ty;
tx=fx[x][y];
ty=fy[x][y];
}
}
void bfs(int dd){
int x,y;
init();
node a,b;
vis[sx][sy]=100000;
dir[sx][sy]='o';
add(sx,sy,dd,0);
while(!q.empty()){
a=q.front();
q.pop();
if(a.x==ex && a.y==ey){
paint(a.i);
return;
}
b.step=a.step+1;
for(int i=0;i<4;i++){
b.x=a.x+to[i][0];
b.y=a.y+to[i][1];
if(judge(b.x,b.y,b.step)){
add(a.x,a.y,i,b.step);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",map[i]+1);
for(int j=1;j<=m;j++){
if(map[i][j]=='C'){
ex=i;ey=j;
}
else if(map[i][j]=='<' || map[i][j]=='>' || map[i][j]=='v' || map[i][j]=='^'){
sx=i;sy=j;
}
}
}
//to[4][2]={1,0, -1,0, 0,1, 0,-1}
int direction;
if(map[sx][sy]=='<') direction=3;
else if(map[sx][sy]=='>') direction=2;
else if(map[sx][sy]=='^') direction=1;
else direction=0;
bfs(direction);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%c",map[i][j]);
}
printf("\n");
}
}
return 0;
}
SPOJ LAS(BFS)题解的更多相关文章
- DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
DFS and BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 畅通工程(自己写的BFS,但后面想了下并查集更好更快)
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- AcWing:177. 噩梦(bfs)
给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...
- 洛谷P1605走迷宫
传送 这是一道dfs,但是...但是....但是它竟然被放在bfs练习题辣!!!! 打了半天bfs,发现路径不会标记了,于是发现好像有什么不对的,似乎dfs要简单一点,于是半路跑去打dfs,结果打了半 ...
- 记 2020蓝桥杯校内预选赛(JAVA组) 赛后总结
目录 引言 结果填空 1. 签到题 2. 概念题 3. 签到题 4. 签到题 程序题 5. 递增三元组[遍历] 6. 小明的hello[循环] 7. 数位递增[数位dp] 8. 小明家的草地[bfs] ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
随机推荐
- webpack笔记一
gulp和grunt都以task来运行不同的命令,而看webpack相关文档都是webpack都是module.下面是一个简单的demo 一.目录解构 二.webpack.config.js文件 co ...
- python-面向对象-09_类属性和类方法
类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...
- mysql 权限管理 针对表的字段 级别 授权 columns_priv表
针对Mike账号 db1库下面的t1表的 id,name字段授予select权限,age字段授予update权限 授权格式 select(要授权的字段,要授权的字段) 用户括号 括起来 .updat ...
- python 基础 内置函数
内置参数 print(all([5,-1,5])) # 非0都是真 true print(all([0,-1,5])) # false print(any([1,0,5])) # 有一个数据为真,就为 ...
- (转)Linux Oracle服务启动&停止脚本与开机自启动
在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...
- 安恒X计划12月月赛
ezweb 主要是序列化问题.没有PHP环境,在线运行的.实例化对象之后修改一下file.然后echo输出序列化的结果.不过下面有一个正则检查.数字前加一个+,影响了正则的匹配,但是对于序列化的还原没 ...
- Hibernate—部分
数据持久化的3种方式: merge()方法: 先得到对象的副本:再判断, 如果副本为瞬时状态,则用save()插入 如果副本为游离状态,则用update()更新 最终都是不改变传入对象的状态 save ...
- Java事件监听的四种实现方式
1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4561 题目: 4561: [JLoi2016]圆的异或并 Time Limit: 30 Sec ...
- MySQL从删库到跑路_高级(二)——自定义函数
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.自定义函数简介 自定义函数(user-defined function UDF)是一种对MySQL扩展的途径,其 ...