你在玩贪吃蛇,游戏在一个n×m 的棋盘上进行。每块可能是空地,也可能是障碍。蛇的长度为 k,占据了 k 个空地,从前往后编号为 1 到 k,蛇头的编号为 1,蛇尾的编号为 k。给你一个地图和一个终点,问你蛇最少走多少步能走到终点(蛇在行走的过程中蛇头不能碰触到蛇身)。如果不能走到终点则输出 -1。 输入格式 第一行有两个整数 n,m; 接下来 n 行每行有 m 个字符,第 i 行的第 j 个字符表示第 i 行的第j个空地的状态: '@':终点 '#':障碍 '.':空地 '1' ~ '9':蛇的身体 输出格式 输出一个整数:答案。 特别地, 当输入: 4 4 #78# .612 .543 ..@. 输出为6 用C语言
时间: 2024-04-07 15:33:27 浏览: 22
vb贪吃蛇_用VB做的一个简单贪吃蛇游戏_
5星 · 资源好评率100%
好的,我会用C语言回答你的问题。以下是一个解决这个问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
int x;
int y;
} Point;
typedef struct {
Point position;
int number;
} SnakeNode;
int bfs(char map[][MAX_SIZE], int n, int m, Point start, Point end, int snakeLength) {
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
bool visited[MAX_SIZE][MAX_SIZE] = {false};
SnakeNode queue[MAX_SIZE * MAX_SIZE];
int front = 0, rear = 0;
queue[rear].position = start;
queue[rear].number = 1;
rear++;
while (front < rear) {
SnakeNode curr = queue[front++];
if (curr.position.x == end.x && curr.position.y == end.y) {
return curr.number - 1;
}
for (int i = 0; i < 4; i++) {
int nx = curr.position.x + dx[i];
int ny = curr.position.y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && (map[nx][ny] == '.' || map[nx][ny] == '@')) {
visited[nx][ny] = true;
if (map[nx][ny] >= '1' && map[nx][ny] <= '9') {
int body = map[nx][ny] - '0';
if (curr.number >= body) {
continue;
}
}
queue[rear].position.x = nx;
queue[rear].position.y = ny;
queue[rear].number = curr.number + 1;
rear++;
}
}
}
return -1;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
char map[MAX_SIZE][MAX_SIZE];
Point start, end;
for (int i = 0; i < n; i++) {
scanf("%s", map[i]);
for (int j = 0; j < m; j++) {
if (map[i][j] == '@') {
end.x = i;
end.y = j;
} else if (map[i][j] == '1') {
start.x = i;
start.y = j;
}
}
}
int snakeLength = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (map[i][j] >= '1' && map[i][j] <= '9') {
snakeLength++;
}
}
}
int steps = bfs(map, n, m, start, end, snakeLength);
printf("%d\n", steps);
return 0;
}
```
请注意,以上代码仅为示例,可能需要根据实际情况进行修改和调试。同时,为了简化问题,我假设输入的地图大小不超过100×100,你可以根据实际情况进行调整。
阅读全文