本题一开始有两个地方卡住了,
一是初始化地图时,用scanf("%c",&mp[i][j]);一直出错,检查了好久,最后改成了成行输入
二是怎么做到坐标轴下标映射到矩阵下标(从0,0开始,参考了别人的代码
Mx = Mx - 1;
My = My - 1;
Mx = Y - Mx - 1;后来才想到其实可以将矩阵转置,将原矩阵每一列从最下面元素变成每一行第一个元素,依次调转,由于矩阵存储是以[0][0]开始,所以Mx、My均需减一.
#include <iostream>
#include <cstdio>
using namespace std;
#include <queue>
char mp[105][105];
char mmp[105][105];
bool vis[105][105];
int X, Y, Mx, My;
//八个方向
int dir[8][2] = { {0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1} };
//x,y为当前坐标,d为当前步数
struct node {
int x, y, d;
};
bool in(int x, int y){
return x >= 1 && x <= X && y >= 1 && y <= Y;
}
int ans = 0;
void BFS(int x, int y){
queue<node> q;
q.push({x,y,0});
vis[x][y] = true;
while(!q.empty()){
node now = q.front();
q.pop();
ans = now.d; 最后一组node的d一定是最短步数
for(int i = 0; i < 8; ++i){
int dx = now.x + dir[i][0];
int dy = now.y + dir[i][1];
if(in(dx, dy) && !vis[dx][dy]){
vis[dx][dy] = true;
q.push({dx, dy, now.d + 1});
}
}
}
}
int main() {
//4 3 1 1
cin >> X >> Y >> Mx >> My;
for(int i = 1; i <= Y; ++i){
for(int j = 1; j <= X; ++j){
cin >> mmp[i][j];
}
}
//矩阵逆置,对应坐标系
int k = 0;
for(int i = Y ; i >= 1; --i){
k = k + 1;
for(int j = 1; j <= X; ++j){
mp[j][k] = mmp[i][j];
if(mp[j][k] == '*'){
vis[j][k] = true;
}
}
}
BFS(Mx,My);
cout << ans <<endl;
return 0;
}
/*
4 3 1 1
....
..*.
.**.
答案:4
*/