<迷宫问题---牛客第六场 之 贪吃蛇>,详解

贪吃蛇,迷宫问题

链接: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
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;

总而言之,通过这道题我学到了不少知识,希望我们这一批小白都更上一层楼,不要半途而废,既然选择了远方,便只顾风雨兼程,永不停歇!希望以后能看到更加优秀的自己,祝自己,也祝大家,加油!

你可能感兴趣的:(平时练习简记,dfs)