这道题是广搜经典题目,比普通的广搜题的举一反三的一点多了一个传送门。所以在这里要用一个数组('A'~'Z')来存储相对应的2个传送门相对应的位置,然后只要特判当走到传送门时,就找到另一个对应的传送门,传送过去即可。在这里要用一个mf[]数组来存储'A'~'Z'中一一对应的魔法阵。x1,y1,x2,y2分别代表2个对应魔法阵的位置。存储进mf数组中的逻辑:如果x1,y1==0,则说明x1,y1没有存储,所以把(i,j)存进x1,y1中。否则,就存进x2,y2中。而在碰到魔法阵时,则要判断当时的mf[a[t2.x][t2.y]].x1是否等于t2.x;mf[a[t2.x][t2.y]].x2是否等于t2.y,如果都是,则说明该传送门对应的传送门的位置应是(mf[a[t2.x][t2.y]].x2,mf[a[t2.x][t2.y]].y2),否则,说明该传送门对应的传送门的位置应是(mf[a[t2.x][t2.y]].x1,mf[a[t2.x][t2.y]].y1)。

还有一点,就是为了避免死循环(2个传送门一直相互传),所以要用一个py来存储走了多少个点了。如果超过了100w,直接跳出,然后输出无解就行了。

代码:

#include <bits/stdc++.h>
using namespace std;
struct dot
{int x,y,step;//一个点的信息
};
struct mag
{int x1,x2,y1,y2;//存储2个魔法阵相对应的下标
} mf[1000];
int vis[1001][1001],n,m,dx[4] = {-1,0,1,0},dy[4] = {0,-1,0,1};
char a[1001][1001];
queue<dot> q;
int main()
{cin>>n>>m;for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++){cin>>a[i][j];if(i == 1 && j == 1){q.push(dot {i,j,0});vis[i][j] = 1;}if(a[i][j] <= 'Z' && a[i][j] >= 'A')if(mf[a[i][j]].x1 == 0 && mf[a[i][j]].y1 == 0) mf[a[i][j]].x1 = i,mf[a[i][j]].y =  j;else mf[a[i][j]].x2 = i,mf[a[i][j]].y2 = j;}int py = 0;while(!q.empty()){if(py > 1000001) break;dot t = q.front();q.pop();for(int i = 0; i < 4; i++){dot t2 = t;t2.x += dx[i];t2.y += dy[i];t2.step += 1;if(t2.x > 0 && t2.y > 0 && t2.x <= n && t2.y <= m && a[t2.x][t2.y] != '1' && vis[t2.x][t2.y] == 0){if(t2.x == n && t2.y == m){cout<<t2.step;return 0;}else if(a[t2.x][t2.y] == '0'){q.push(t2);vis[t2.x][t2.y] = 1;}else if(a[t2.x][t2.y] >= 'A' && a[t2.x][t2.y] <= 'Z'){if(mf[a[t2.x][t2.y]].x1 == t2.x && mf[a[t2.x][t2.y]].y1 == t2.y) q.push(dot {mf[a[t2.x][t2.y]].x2,mf[a[t2.x][t2.y]].y2,t2.step});else if(mf[a[t2.x][t2.y]].x2 == t2.x && mf[a[t2.x][t2.y]].y2 == t2.y) q.push(dot {mf[a[t2.x][t2.y]].x1,mf[a[t2.x][t2.y]].y1,t2.step});}}/*for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++)cout<<vis[i][j]<<" ";cout<<endl;}cout<<t.x<<" "<<t.y<<endl<<t2.x<<" "<<t2.y<<endl<<endl;*/}py++;}cout<<"No Solution.";return 0;
}

徐老师的回家之路(广搜最难题)相关推荐

  1. 深圳内推 | 香港中文大学(深圳)路广利老师招聘NLP方向研究助理

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 香港中文大学(深圳) 香港中文大学(深圳)(英语:The Chinese ...

  2. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  3. Poj_3984走迷宫(广搜)

    Description 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0 ...

  4. poj3984 迷宫问题 bfs 最短路 广搜

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27913   Accepted: 16091 Descriptio ...

  5. hdu 1253 胜利大逃亡 (广搜)

    题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个 ...

  6. 抓住那头牛(BFS广搜)

    描述 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次移动 ...

  7. 【双端队列广搜/搜索+图论】AcWing 2019.拖拉机 USACO 2012 March Contest Silver Division

    [题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 NNN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除 ...

  8. 深搜和广搜的原理及优缺点

    深搜原理 深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇 ...

  9. [转]尚学堂科技 - 马士兵老师-JAVA自学之路

    [原创 - 尚学堂科技 - 马士兵老师] JAVA自学之路 一:学会选择 [转载请注明出处:http://www.bjsxt.com/zixue/zixuezhilu_1.html] 为了就业,不少同 ...

最新文章

  1. 过滤流的主要特点是什么_高效过滤器工艺流程是什么 高效过滤器特点介绍【详解】...
  2. python经典例题图形_Python 入门经典100实例:实例23 菱形
  3. SparkSQL在IDEA中的使用
  4. 使用openpyxl去操作Excel表格
  5. Qt对象类型转换(char* int与Qstring间的转换)
  6. HDU3333 Turing Tree 离线树状数组
  7. CUDA ERROR: device-side assert triggered at解决
  8. SSDO AO 图像空间的动态全局光照
  9. ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程
  10. linux定向查日志_linux日志查找技巧
  11. php不支持redis
  12. HDOJ--4548--美素数
  13. C++读取和写入文件(fstream等)
  14. 如何零基础入门PS软件?
  15. android timepicker 固定样式,android-如何设置格式为24h的TimePicker显示
  16. 数据告诉你,谁是2019年最硬核公链?
  17. 电商项目实战之支付宝支付订单
  18. adb命令操作安卓hosts文件
  19. 码农被3年资深程序员狂喷:根本不懂代码!
  20. 好书推荐---单片机编程魔法师之高级裸编程思想

热门文章

  1. 【开源云要闻回顾】RedHat将支持微软容器、ONAP与MEF达成合作......
  2. IP地址基本概念及划分为A、B、C三类地址
  3. 宝塔Linux面板使用一键迁移插件实现网站快速搬家图文教程
  4. mdadm 删除 软件 RAID
  5. 太漂亮啦!洛杉矶车展首发 新一代马自达3谍照曝光
  6. ORA-01436: 用户数据中的 CONNECT BY 循环
  7. html转pdf工具安卓版,html转pdf工具(wkhtmltopdf)v2018 官方版
  8. HP P1008打印机如何打印特殊纸张
  9. 【安装包】视频编辑王
  10. C语言的getchar和putchar