2021牛客寒假算法基础集训营6 I.贪吃蛇

I.贪吃蛇

题目链接: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≤n,m≤100 ,保证起点不是围墙。

解题思路:

从起点到终点bfs广搜求最短路径,注意进制转换(最后的结果乘上100)

代码如下:

#include <iostream>
#include<queue>
using namespace std;
const int INF = 10005;
typedef pair<int,int> PA; 
char maze[105][105];
int n,m;  
int sx,sy;  //开始位置坐标
int gx,gy;   //结束位置坐标
int d[105][105];
int dx[4]={
    
    1,0,-1,0},dy[4]={
    
    0,1,0,-1};  //移动
int bfs(){
    
    
	queue<PA> que;
	for (int i = 0; i < n; i++) 
		for (int j = 0; j <m; j++) 
			d[i][j] = INF;  //初始化
	que.push(PA(sx,sy));
	d[sx][sy]=0;
	while(que.size()){
    
    
		PA p=que.front();
		que.pop();
		if(p.first==gx&&p.second==gy) break; 
		for(int i=0;i<4;i++){
    
    
			int nx=p.first+dx[i];
			int ny=p.second+dy[i];		
			if(nx>=0&&nx<n&&ny>=0&&ny<m  //判断边界
				&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
    
      //判断可移动&没走过
					que.push(PA(nx,ny));
					d[nx][ny]=d[p.first][p.second]+1; 
			} 
		}
	}
	return d[gx][gy];	
} 
int main(){
    
    
	scanf("%d%d",&n,&m);
	scanf("%d%d%d%d",&sx,&sy,&gx,&gy);
	for(int i=0;i<n;i++){
    
    
		scanf("%s",maze[i]);
	}
	sx--, sy--, gx--, gy--;
	int ans = bfs();
	if(ans!=INF)
		printf("%d\n",ans*100);
	else
		printf("-1\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45894701/article/details/114034469
今日推荐