算法提高 学霸的迷宫

网友投稿 241 2022-09-23

算法提高 学霸的迷宫

问题描述 不是这题的正解   学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。 输入格式   第一行两个整数n, m,为迷宫的长宽。   接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。 输出格式   第一行一个数为需要的最少步数K。   第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。 样例输入 Input Sample 1: 3 3 001 100 110 Input Sample 2: 3 3 000 000 000 样例输出 Output Sample 1: 4 RDRD Output Sample 2: 4 DDRR 数据规模和约定   有20%的数据满足:1<=n,m<=10   有50%的数据满足:1<=n,m<=50   有100%的数据满足:1<=n,m<=500。

#include#includeusing namespace std;struct Node{ int x,y; Node(int x,int y){ this->x = x; this->y = y; }};vector nv;int step[4][2]= {-1,0,1,0,0,-1,0,1};char chstep[4] = {'U','D','L','R'};int a[510][510],b[510][510]={0};int row,col;bool check(Node node){ if(node.x>0&&node.x<=row&&node.y>0&&node.y<=col&&a[node.x][node.y]==0&&b[node.x][node.y]==0) return true; return false;}void DFS(int m,int n){ if(m==row&&n==col) { //输出exit() int size = nv.size(); cout << size << endl; for(int i = 0; i < nv.size();i++) { cout << nv[i]; } exit(0); } //b[m][n] = 1; for(int i = 0;i < 4;i++) { Node node(m+step[i][0],n+step[i][1]); if(check(node)&&b[node.x][node.y]==0) { nv.push_back(chstep[i]); b[node.x][node.y] = 1; cout << "走:"<> row >> col; for(int i = 1;i <= row;i++) { string s; cin >> s; for(int j = 1;j <= col;j++) { a[i][j] = s[j-1]-'0'; } cout << endl; } DFS(1,1);}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据结构算法思想
下一篇:丁道师:下沉市场走访观察:双十一来到线下!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~