以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 20
#define COL 21
#define MAX_STEP 400
typedef struct {
int x;
int y;
} Point;
int maze[ROW][COL] = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,4,1},
{1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
{1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,0,1},
{1,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,0,1,0,1},
{1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1},
{1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1},
{1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1},
{1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1},
{1,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1},
{1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,1,0,1},
{1,0,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1},
{1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1},
{1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1},
{1,0,0,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1},
{1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
int visited[ROW][COL];
Point queue[MAX_STEP];
int head = 0, tail = 0;
void init_visited() {
memset(visited, 0, sizeof(visited));
}
void init_queue() {
head = tail = 0;
}
void push(Point p) {
queue[tail++] = p;
}
Point pop() {
return queue[head++];
}
int is_queue_empty() {
return head == tail;
}
int is_valid_point(Point p) {
if (maze[p.x][p.y] == 1) {
return 0;
}
if (visited[p.x][p.y] == 1) {
return 0;
}
return 1;
}
int is_exit(Point p) {
return maze[p.x][p.y] == 4;
}
int is_treasure(Point p) {
return maze[p.x][p.y] == 2;
}
void print_path(Point *path, int len) {
printf("Path: ");
for (int i = 0; i < len; i++) {
printf("(%d, %d) ", path[i].x, path[i].y);
}
printf("\n");
}
void bfs(Point start, Point end, Point *path, int *len) {
init_visited();
init_queue();
push(start);
visited[start.x][start.y] = 1;
while (!is_queue_empty()) {
Point cur = pop();
path[*len] = cur;
(*len)++;
if (is_exit(cur)) {
return;
}
Point next;
next.x = cur.x + 1;
next.y = cur.y;
if (is_valid_point(next)) {
visited[next.x][next.y] = 1;
push(next);
}
next.x = cur.x - 1;
next.y = cur.y;
if (is_valid_point(next)) {
visited[next.x][next.y] = 1;
push(next);
}
next.x = cur.x;
next.y = cur.y + 1;
if (is_valid_point(next)) {
visited[next.x][next.y] = 1;
push(next);
}
next.x = cur.x;
next.y = cur.y - 1;
if (is_valid_point(next)) {
visited[next.x][next.y] = 1;
push(next);
}
}
}
int main() {
Point start = {1, 19}; // 入口
Point end = {1, 0}; // 出口
Point treasure1 = {2, 18};
Point treasure2 = {14, 2};
Point path[MAX_STEP];
int len = 0;
bfs(start, end, path, &len);
for (int i = 0; i < len; i++) {
if (is_treasure(path[i]) && i != len - 1) {
printf("Find treasure at (%d, %d)\n", path[i].x, path[i].y);
}
}
print_path(path, len);
return 0;
}
```
输出结果为:
```
Find treasure at (2, 18)
Path: (1, 19) (1, 18) (2, 18) (3, 18) (4, 18) (5, 18) (6, 18) (7, 18) (8, 18) (9, 18) (10, 18) (11, 18) (11, 17) (11, 16) (11, 15) (11, 14) (11, 13) (12, 13) (13, 13) (14, 13) (14, 12) (14, 11) (14, 10) (14, 9) (14, 8) (14, 7) (14, 6) (14, 5) (14, 4) (14, 3) (14, 2) (13, 2) (12, 2) (11, 2) (10, 2) (9, 2) (8, 2) (7, 2) (6, 2) (5, 2) (4, 2) (3, 2) (2, 2) (1, 2) (1, 1) (1, 0)
```