题目大意:一个二维数组存在镜子,遇到镜子可以发生折射,否则一直走,要求你从左上角到右下角,是否可以到达,至少要几个镜子
解题思路:这道题最短路二维数组用的是BFS,但是因为他有折射,也就是说我要把一个格子当作两个格子去处理,彼此之间双连通,然后从终点往回bfs求即可
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<vector>
#include <bitset>
#include<algorithm>
#include <queue>
#include<map>
using namespace std;
vector<int> tu[20005];
bool vis[20005];
int n, m;
char a[10005][10005];
int lu[10005];
void bfs()
{
int i, x, y;
queue<int> qua;
vis[n] = true;
qua.push(n);
while (!qua.empty())
{
x=qua.front();
qua.pop();
for (i = 0; i < tu[x].size(); i++)
{
y = tu[x][i];
if (vis[y] != true)
{
vis[y] = true;
qua.push(y);
lu[y] = lu[x] + 1;
}
}
}
}
int main()
{
int i, j;
cin >> n >> m;
memset(vis, false, sizeof(vis));
memset(lu, 0, sizeof(lu));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> a[i][j];
if (a[i][j] == '#')
{
tu[i].push_back(j + n);
tu[j + n].push_back(i);
}
}
}
bfs();
if (lu[1] != 0)
{
cout << lu[1] << endl;
}
else
{
cout << -1 << endl;
}
}