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;
}