#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 四个方向的偏移量
int bfs(vector<vector<char>>& map) {
vector<vector<int>> ans(n, vector<int>(n, INT_MAX)); // 记录最短路径长度的数组
queue<pair<int, int>> q; // 广度优先搜索的队列
ans[1][1] = 0; // 起点到自身的路径长度为0
q.push({1, 1}); // 将起点加入队列
while (!q.empty()) {
pair<int, int> curr = q.front(); // 当前位置
q.pop();
int x = curr.first; // 当前位置的横坐标
int y = curr.second; // 当前位置的纵坐标
if (x == n - 2 && y == n - 2) { // 如果到达终点
return ans[x][y]; // 返回最短路径长度
}
// 遍历四个方向
for (auto& dir : dirs) {
int nx = x + dir[0]; // 计算下一个位置的横坐标
int ny = y + dir[1]; // 计算下一个位置的纵坐标
// 判断下一个位置是否合法,是否为可通行的路,并且之前没有访问过
if (nx >= 0 && nx < n && ny >= 0 && ny < n && map[nx][ny] != '#' && ans[nx][ny] == INT_MAX) {
ans[nx][ny] = ans[x][y] + 1; // 更新最短路径长度
q.push({nx, ny}); // 将下一个位置加入队列
}
}
}
return -1; // 没有找到路径
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
vector<vector<char>> map(n, vector<char>(n)); // 迷宫地图
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j]; // 读取迷宫地图
}
}
int shortestPath = bfs(map); // 使用广度优先搜索计算最短路径长度
if (shortestPath == -1) {
cout << "No solution!"; // 没有找到路径
} else {
cout << shortestPath; // 输出最短路径长度
}
return 0;
}
#include <bits/stdc++.h>//答案包括起點本身
using namespace std;int n;
vector<vector<int>> dirs = {{-1,0},{1,0},{0,-1},{0,1}};int bfs(vector<vector<char>>& map){ //&可以直接讓數字回傳到初始的map裡,除掉不必要的浪費(&是引用)
vector<vector<int>> ans(n,vector<int>(n,INT_MAX)); //INT_MAX就是int最大值
queue<pair<int,int>> q;
ans[1][1] = 1;//這邊應該改為1
q.push({1,1});while(!q.empty()){ //當q裡面不是空的
pair<int,int> curr = q.front(); //front是獲取對列頭部的元素,所以curr={1,1}
q.pop(); // pop是移除對列頭部的元素
int x = curr.first; //獲取pair的第一個數值
int y = curr.second;//獲取pair的第二個數值if(x == n-2 && y == n-2){//是否到終點
return ans[x][y];
}
for(auto & dir : dirs){ //從dirs中抓需要的值->dir //總共跑四個方向所以跑四次
int nx = x + dir[0];
int ny = y + dir[1]; //這兩行分別是dirs中{1,0}的1跟0(如果是跑第一圈的時候)if(nx >= 0 && nx < n && ny >= 0 && ny < n && map[nx][ny] != '#' && ans[nx][ny] == INT_MAX){ //ans[nx][ny] == INT_MAX查看點是否被訪問過,如果 == INT_MAX則代表沒被訪問過
ans[nx][ny] = ans[x][y] + 1;
q.push({nx,ny});
}
}
}
return -1; //沒找到路徑
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);cin >> n;
vector<vector<char>> map(n, vector<char>(n)); // 迷宫地图
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j]; // 读取迷宫地图
}
}int shortestPath = bfs(map); // 使用广度优先搜索计算最短路径长度
if (shortestPath == -1) {
cout << "No solution!"; // 没有找到路径
}
else {
cout << shortestPath; // 输出最短路径长度
}
return 0;
}
沒事就小改一下,這題要AC的話上面這個程式碼ans[1][1]應該要設1,題目說包括起點。