嗨嗨嗨~

sjbyshz CSP-J一等 2022-03-15 18:30:43 2

#include <bits/stdc++.h>

using namespace std;

struct path { int x, y; }; //结构体 定义坐标变量;

int main() { int f[45][45];

path t[1605];                                                // t表示可去的路径
int v[4][2] = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };  //右 下 上 左
char c;
int i, j, n, m, k, g;   // k表示当前位置,g表示能去的位置;
path start, last, mid;  //出发点、终点、中间点定义为坐标变量

memset(f, 0, sizeof(f));  //先默认到处可去
cin >> n >> m;

for (i = 0; i <= n; i++) {
    f[i][0] = -1;
    f[i][m + 1] = -1;
}
for (i = 0; i <= m; i++) {
    f[0][i] = -1;
    f[n + 1][i] = -1;
}
//周围设成墙

for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
        cin >> c;
        if (c == '#')
            f[i][j] = -1;  //墙用-1表示
        else if (c == 'S') {
            start.x = i;
            start.y = j;
        }  //记录起点
        else if (c == 'T') {
            last.x = i;
            last.y = j;
        }  //记录终点
    }
}

t[0].x = start.x;
t[0].y = start.y;  //初始化,起点肯定是可去的路径
k = 0;
g = 0;  // k表示当前位置   g表示能去的位置;
while ((t[k].x != last.x || t[k].y != last.y) && k <= g)  //当前位置与终点不重合且后面有路径可去;
{
    for (i = 0; i < 4; i++) {
        mid.x = t[k].x + v[i][0];  //计算中转点x坐标
        mid.y = t[k].y + v[i][1];  //计算中转点y坐标
        if (f[mid.x][mid.y] == 0)  //如果中转点可以去
        {
            f[mid.x][mid.y] = f[t[k].x][t[k].y] + 1;  //中转点的步数等于原来的步数+1
            g++;                                      //可去的地方就增加了
            t[g].x = mid.x;
            t[g].y = mid.y;  //把中转点设置为可去的点
        }
    }
    k++;  //当前位置走完了,去下个能去的位置试试
}

if (f[last.x][last.y] != 0)  //如果走的到
    cout << f[last.x][last.y] << endl;
else
    cout << "-1" << endl;  //走不到就数字不会变
return 0;

}

{{ vote && vote.total.up }}