视频可算是做完了,可以敲题了

gg  我改了一天的这个题目,心痛到无法呼吸;

细节是挺麻烦的,但是思路是简单的,bfs

不过这个题目因为有方向,所以用了一个四维数组去存储这个点的状态是否存在,此点面朝z方向,向k方向是否可以行进;

对于路径的存储,是比较有新意的地方,用一个p数组去存储当前点的根,然后开始倒回去进行寻找路径

错误点1:

dfs的初点应该是起点面向方向直行之后的状态,不要直接用起点,因为有数据,起点是包含在内的

例:

MyMaze4
2 2 W 3 2
1 1 NR *
1 2 ER *
2 1 WR *
2 2 SF *
0

错误2:

可能是直接由起点到终点

#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>using namespace std;
const int maxn=15;
string dirr="NESW";
string dire="FLR";
int dr[]={-1,0,1,0};
int dc[]={0,1,0,-1};struct Node
{int r,c;int dir;Node(int rr=0,int cc=0,int di=0){r=rr;c=cc;dir=di;}Node(const Node & s){r=s.r;c=s.c;dir=s.dir;}
};
int d[maxn][maxn][maxn];
Node p[maxn][maxn][maxn];
int getok[maxn][maxn][maxn][maxn];
int have[maxn][maxn];
int r1,r2,dir0;
int r0,c0,rn,cn;
int maxx;
Node wall(Node s,int turn)
{int dir=s.dir;if(turn ==1) dir=(dir+3)%4;if(turn==2) dir=(dir+1)%4;return Node(s.r+dr[dir],s.c+dc[dir],dir);
}
int id_dirr(char s)
{for(int i=0;i<4;i++){if(dirr[i]==s)return i;}
}
int id_dire(char s)
{for(int i=0;i<3;i++){if(dire[i]==s)return i;}
}
void print(int si)
{vector<Node> h;h.clear();Node u(rn,cn,si);h.push_back(u);while(1){Node q=p[u.r][u.c][u.dir];if(!d[q.r][q.c][q.dir]){   h.push_back(Node(q));break;}u=q;h.push_back(q);}int l=h.size();int ll=0;cout<<"  ";cout<<"("<<r0<<","<<c0<<") ";for(int i=l-1;i>=0;i--){cout<<"("<<h[i].r<<","<<h[i].c<<")";//注意格式ll++;if(ll==l)cout<<endl;else if(ll%10==9)cout<<endl<<"  ";elsecout<<" ";}
}
int inside(int r,int c)
{if(r<=0||c<=0||c>maxx||r>maxx)return 0;elsereturn 1;
}
void bfs()
{queue<Node> q;Node qq=wall(Node(r0,c0,dir0),0);q.push(qq);d[qq.r][qq.c][qq.dir]=0;if(qq.r==rn&&qq.c==cn){cout<<"  "<<"("<<r0<<","<<c0<<") "<<"("<<rn<<","<<cn<<")"<<endl;}else{//cout<<qq.r<<" "<<qq.c<<" "<<qq.dir<<endl;int flag=0;while(q.size()){Node u=q.front();q.pop();if(u.r==rn&&u.c==cn){print(u.dir);flag=1;break;}for(int i=0;i<3;i++){Node v=wall(u,i);//cout<<v.r<<" "<<v.c<<" "<<v.dir<<endl;// cout<<d[v.r][v.c][v.dir]<<" "<<getok[u.r][u.c][u.dir][i]<<" "<<inside(v.r,v.c)<<" "<<have[v.r][v.c]<<endl;if(d[v.r][v.c][v.dir]<0&&getok[u.r][u.c][u.dir][i]&&inside(v.r,v.c)&&have[v.r][v.c]){d[v.r][v.c][v.dir]=d[u.r][u.c][u.dir]+1;p[v.r][v.c][v.dir]=u;q.push(v);}}}if(!flag)printf("  No Solution Possible\n");}}int main()
{string s;//freopen("out.txt","w",stdout);while(cin>>s&&s!="END"){maxx=0;memset(p,0,sizeof(p));memset(d,0xff,sizeof(d));memset(getok,0,sizeof(getok));memset(have,0,sizeof(have));int r,c;char ch;string h;cin>>r0>>c0>>ch>>rn>>cn;dir0=id_dirr(ch);//cout<<dir0<<endl;have[r0][c0]=1;have[rn][cn]=1;maxx=max(maxx,r0);maxx=max(maxx,c0);maxx=max(maxx,rn);maxx=max(maxx,cn);//  getok[r0][c0][dir0][0]=1;while(cin>>r&&r){cin>>c;maxx=max(maxx,r);maxx=max(maxx,c);have[r][c]=1;while(cin>>h&&h!="*"){int f1=id_dirr(h[0]);int f2;for(int i=1;i<h.size();i++){f2=id_dire(h[i]);// cout<<f1<<" "<<f2<<endl;getok[r][c][f1][f2]=1;}}}cout<<s<<endl;//cout<<"maxx"<<maxx<<endl;bfs();}return 0;
}

d

UVA-816 Abbott's Revenge (bfs)相关推荐

  1. UVa 1602:Lattice Animals(BFS)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=841& ...

  2. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  3. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  4. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  5. 【洛谷】马的遍历--广度优先搜索(BFS)

    题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...

  6. 二叉搜索树(BFS)总结

    满二叉树 定义:高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树. 完全二叉树 定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上.这样的二叉 ...

  7. 广度优先搜索(BFS)与深度优先搜索(DFS)

    一.广度优先搜索(BFS) 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val = xself.left = Nonesel ...

  8. 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

    二叉树的深度优先遍历(DFS)与广度优先遍历(BFS) 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点 ...

  9. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次"解救小哈"的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLi ...

  10. 从起始点到目标点的最短步数(BFS)

    从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在古老的魔兽传说中,有两个军团,一 ...

最新文章

  1. webform里的验证控件
  2. C++拾趣——使用多态减少泛型带来的代码膨胀
  3. Nutch 二次开发之parse正文内容
  4. 正则表达式及shell
  5. 处理硬件设备访问权限问题
  6. mfc获取子窗口句柄_前端设计-JavaScript中父窗口与子窗口间的通信
  7. 手把手带你基于嵌入式Linux移植samba服务
  8. 为什么开发移动端web不使用jQuery
  9. ThinkPHP5框架下载安装
  10. php地图找房代码,vue-baidu-map简单实现地图找房
  11. 笔记本 续航测试软件,续航测试:较高强度运行状态_笔记本评测-中关村在线
  12. Java-String类常用方法汇总
  13. Matlab中滤波操作的相关函数
  14. BCH/BCHABC/BCHSV分叉后重放机制小结
  15. matlab练习程序(图像放大/缩小,双线性插值)
  16. 人工智能和自动化之间,主要有区别吗?
  17. html5分镜头脚本范例,分镜头脚本模板(小故事分镜头脚本范例)
  18. 数字图像-颜色表介绍
  19. SSM在线学习网站的设计与实现毕业设计源码011451
  20. Android下拉刷新的实现(一) - SwipeRefreshLayout篇

热门文章

  1. 重复文件清理绿色工具——DoubleKiller
  2. Iperf官方andriod版iperf3
  3. android绑定两个ip,安卓手机模拟器如何多开切换IP防封号的最新方法介绍
  4. Objective-C概述
  5. VARCHART XGantt适用于.NET v5.1 Build 337
  6. 二次量子化与量子计算化学
  7. 四川农业大学计算机专业答辩,关于2014级本科生毕业论文答辩的通知
  8. java基于ssm的学校教务管理系统的设计与实现论文
  9. troublemaker中文谐音_trouble maker的中文音译歌词 希望准确的遵循原来的发音。。。不是中文歌词和韩语歌词!要的是音译啊 注意...
  10. word文件转pdf转换器注册码