贪吃蛇,迷宫问题
链接:https://ac.nowcoder.com/acm/contest/9986/I
来源:牛客网
题目描述
无限增长的贪吃蛇小游戏:
在一个n*m的迷宫中,有一条小蛇,地图中有很多围墙,猥琐的出题者用“#”表示,而可以走的路用“.”表示,小蛇他随机出生在一个点上,出生点表示为“S”,他想抵达的终点表示为“E”,小蛇有一个奇怪的能力,他每走一格便会增长一格,即他走了一格后,他的尾巴不会缩回。
小蛇想知道他怎么到达他想去的地方,请你帮助他。
PS:每格长1米,贪吃蛇规定不能撞墙,不能咬自己的身体。
输入描述:
第一行:输入N,M;
第二行:输入S的坐标Xs,Ys,E的坐标Xe,Ye;
后面的N行:
每行输入M个数,描述每一行的情况。
输出描述:
输出一个数,小蛇到达终点的最短距离(单位:cm),若无法达到,输出-1
示例1
输入
复制
3 3
1 1 3 3
.#.
.#.
…
输出
复制
400
示例2
输入
复制
5 5
1 1 5 5
…###
.#…
.#.#.
.#.#.
…#.
输出
复制
1400
备注:
对于 100% 的数据:1\le n,m\le 1001≤n,m≤100 ,保证起点不是围墙。
说一下内心的ruoruo的想法~
我还是太菜了
签完到之后就来看这个题了
那个签到的竟然错了4次,该打,pia
这个题是一个典型的模板题,dfs深搜纯纯的模板,题的大致意思是说有一条小蛇,从起点到终点,#是障碍物,. 是可以走的,求最短路径,内心世界很复杂,因为我并不是很熟练
我的思路是把 # 和 . 转化为 2 和 1,1是通路,2是障碍物,存到一个数组里a[120][120],再加一个v数组记录该点是否经过,0代表未访问,1代表已访问
- 看代码,咱们慢慢仔细讲~
- 代码中dx数组和dy数组解释看这里
#include<bits/stdc++.h>
using namespace std;
int a[120][120];//1 2-->障碍物
int n,m;
int xs,ys,xe,ye;
int minn=99999999;
int v[120][120];//0-->未访问 1-->访问
int dx[4]={0,1,0,-1};//对x来说的四个方向!
int dy[4]={1,0,-1,0};//对y来说的四个方向
void dfs(int x,int y,int step){
if(x==xe&&y==ye){//若能到达终点,return
if(step<minn)minn=step;
return ;
}
for(int k=0;k<4;k++){//四个方向
int tx,ty;
tx=x+dx[k];
ty=y+dy[k];
if(a[tx][ty]==1&&v[tx][ty]==0){///是通道&&未访问
v[tx][ty]=1;//那么就标记为已访问
dfs(tx,ty,step+1);//已访问则step+1
v[tx][ty]=0;//回溯完之后再标记为未访问
}
}
}
int main() {
cin>>n>>m;
cin>>xs>>ys>>xe>>ye;//输入起点和终点
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>str[i][j];
if(str[i][j]=='.')a[i][j]=1;
else a[i][j]=2;//存进去!
}
}
v[xs][ys]=1;//初始化为1;
dfs(xs,ys,0);//初始step=0
if(minn==99999999)printf("-1");
else
printf("%d",minn*100);
return 0;
}
图片我调不过来,那我就在最后解释一下dx dy数组叭~
假设初始位置是x, y;
int dx[4]={0,1,0,-1};//对x来说的四个方向!
int dy[4]={1,0,-1,0};//对y来说的四个方向
往下走会变成(x+1,y);对应1,0
往左走会变成(x,y-1);对应0,-1
往上走会变成(x-1,y);对应-1,0
往右走会变成(x,y+1);对应0,1;
总而言之,通过这道题我学到了不少知识,希望我们这一批小白都更上一层楼,不要半途而废,既然选择了远方,便只顾风雨兼程,永不停歇!希望以后能看到更加优秀的自己,祝自己,也祝大家,加油!