题目: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)题解的更多相关文章

  1. DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告

    DFS and  BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ...

  2. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  3. 畅通工程(自己写的BFS,但后面想了下并查集更好更快)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  4. AcWing:177. 噩梦(bfs)

    给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...

  5. HDU 1560 DNA sequence (IDA* 迭代加深 搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ...

  6. 洛谷P1605走迷宫

    传送 这是一道dfs,但是...但是....但是它竟然被放在bfs练习题辣!!!! 打了半天bfs,发现路径不会标记了,于是发现好像有什么不对的,似乎dfs要简单一点,于是半路跑去打dfs,结果打了半 ...

  7. 记 2020蓝桥杯校内预选赛(JAVA组) 赛后总结

    目录 引言 结果填空 1. 签到题 2. 概念题 3. 签到题 4. 签到题 程序题 5. 递增三元组[遍历] 6. 小明的hello[循环] 7. 数位递增[数位dp] 8. 小明家的草地[bfs] ...

  8. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

  9. HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. vmware 安装 kali linux 系统到U盘 启动错误(initramfs:) 修复方法

    安装kalilinux到U盘 启动之后出现这个错误: 这是grub路径不对. 解决办法: 在这模式下可以输入命令:blkid 查看所列举出的磁盘 找到你的U盘系统 TYPE="ext4&qu ...

  2. 011-jdk1.8版本新特性三-Date API

    1.7.Date API Java 8 在包java.time下包含了一组全新的时间日期API.新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的 ...

  3. 更改docker服务网段分配地址

    docker安装完毕后,会自动生成一个网卡名为docker0的网桥,如果其默认分配的网段地址和已有地址段冲突,可按如下步骤修改. 查看默认地址段如下 docker0: flags=4099<UP ...

  4. 2.keras实现-->深度学习用于文本和序列

    1.将文本数据预处理为有用的数据表示 将文本分割成单词(token),并将每一个单词转换为一个向量 将文本分割成单字符(token),并将每一个字符转换为一个向量 提取单词或字符的n-gram(tok ...

  5. python中的re模块中的向后引用和零宽断言

    1.后向引用 pattern = re.compile(r"(\w+)")#['hello', 'go', 'go', 'hello'] # pattern = re.compil ...

  6. Selenium Webdriver——操作隐藏的元素(二)display属性

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...

  7. HOW TO: 在 Visual C# .NET 应用程序中提供文件拖放功能

    本文假定您熟悉下列主题: Windows 窗体列表框控件 Windows 窗体事件处理 生成示例的步骤 列表框控件提供了您需要处理的两个拖放事件: DragEnter 和 DragDrop. 当您在控 ...

  8. 学习Css补充知识点

    1.text-transform: capitalize;UpperCase等 2.border-size:box,边框在定义的宽高范围内画,  content默认,在宽高外画.元互的宽高只指内容 3 ...

  9. 使用PowerMockito 对静态类进行mock

    Mock的中文的意思就是模拟,Mockito是mock的扩展,但是Mockito并不支持对静态类的mock,所以我们引入PowerMockito实现对静态类的mock. 首先pom添加PowerMoc ...

  10. Impala SQL 语言元素(翻译)[转载]

    原 Impala SQL 语言元素(翻译) 本文来源于http://my.oschina.net/weiqingbin/blog/189413#OSC_h2_2 摘要 http://www.cloud ...