问题描述 不是这题的正解
学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
第一行两个整数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<iostream>
#include<queue>
using namespace std;
struct Node
{
int x,y;
Node(int x,int y){
this->x = x;
this->y = y;
}
};
vector<char> 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 << "走:"<<node.x <<" "<< node.y << endl;
DFS(node.x,node.y);
b[node.x][node.y] = 1;
cout << "返回:"<<node.x <<" "<< node.y << endl;
nv.pop_back();
}
}
}
int main()
{
freopen("in.txt","r",stdin);
b[1][1] = 1;
cin >> 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);
}