传送门.
思路:
开数组去记录点的上一个点是谁来记录路径,有点麻烦,当时没想到用结构体;
bfs板子题;
其实用结构体记录路径未尝不可 太懒了不想尝试了hhh
输出有坑点,(0, 0) 逗号后有一个空格
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <stack>
#define me memset
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N = 10010;
const int null = 0x3f3f3f3f;
int g[10][10];
int d[10][10];
int Prevx[10][10],Prevy[10][10];
stack <int> sx,sy;
void bfs()
{
me(d,-1,sizeof d);
d[0][0] = 0;
queue<int> qx,qy;
qx.push(0);
qy.push(0);
int dx[4] = {0,1,0,-1},dy[4] = {1,0,-1,0};
while(qx.size() && qy.size())
{
int t1 = qx.front();
qx.pop();
int t2 = qy.front();
qy.pop();
for(int i = 0;i < 4;i ++)
{
int x = t1 + dx[i];
int y = t2 + dy[i];
if(x >= 0 && y >= 0 && x < 5 && y < 5 && d[x][y] == -1 && !g[x][y])
{
d[x][y] = d[t1][t2] + 1;
Prevx[x][y] = t1,Prevy[x][y] = t2;
qx.push(x);
qy.push(y);
}
}
}
int i = 4,j = 4;
while(i || j)
{
//cout << "(" << i << "," << j << ")";
sx.push(i);
sy.push(j);
int x = Prevx[i][j],y = Prevy[i][j];
i = x;
j = y;
}
cout << "(0, 0)" << endl;
while(sx.size() && sy.size())
{
int px = sx.top();
int py = sy.top();
cout << "(" << px << ", " << py << ")" << endl;
sx.pop();
sy.pop();
}
}
int main()
{
for(int i = 0;i < 5;i ++)
{
for(int j = 0;j < 5;j ++)
{
cin >> g[i][j];
}
}
bfs();
}