算法1
BFS
其他的都很好理解,就是我写的时候有一个问题,找了好久最后找到啦~~
就是在打印路线的时候我直接用原来的变量进行更新的就比如我用
en.x = tath[en.x][en.y].x; (1)
en.y = path[en.x][en.y].y; (2)
看着没有问题,但其实在1式中end.x已经被更新了,我却用这个已经被更新的变量去更新上一次还未更新的en.y所以答案肯定就错误啦~~,因此需要把变量保存下来,然后用上一次的变量去更新这一次的值。
时间复杂度
参考文献
C++ 代码
#include <queue>
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int g[N][N];
PII memory[N][N];
int st[N][N];
int n;
void bfs()
{
queue<PII> q;
q.push({n - 1, n - 1});
st[n - 1][n - 1] = true;
int dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i ++)
{
int x = dx[i] + t.x, y = dy[i] + t.y;
if(x < 0 || x >= n || y < 0 || y >= n)continue;
if(st[x][y])continue;
if(g[x][y] == 1)continue;
q.push({x, y});
st[x][y] = true;
memory[x][y] = t;
}
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
cin >> g[i][j];
bfs();
PII end = {0, 0};
cout << 0 << ' ' << 0 << endl;
while(end.x != n - 1 || end.y != n - 1)
{
printf("%d %d\n", memory[end.x][end.y].x, memory[end.x][end.y].y);
int x = end.x, y = end.y;
end.x = memory[x][y].x, end.y = memory[x][y].y;
}
return 0;
}
麻烦问下如果起点不固定为(0,0),应该如何考虑呢
如果起点为x1, y1;
auto t = q.front();
q.pop();
if(p.x == x1 && p.y == y1)return;
大佬们,怎么回事后面几个数据一直Segmentation Fault
感谢
请问st数组是干啥滴捏
用来标记没重复的吧
nice!nice!
你拿周赛了吗
没有呢, 最近事情太多了, 懈怠了
挺住呀
最近忙着出算法easy课hhh, 过段时间来打周赛
大佬
还早呢hhh, 正在路上
%%%%%%%%%%%%%%%%
感谢楼主 我也遇到了相同问题 打断点慢慢调试终于看见了hhh
+1
+1
+1
就是从0,0开始去找
这个和你存的坐标有关,存储的是这个点由谁更新过来,最后倒着递推就行啦。你如果从0,0开始存就应该从n,m开始找,如果从n,m开始存就应该从0,0来找。
https://www.acwing.com/activity/content/code/content/1100479/ 我是从0,0开始搜 那么最后输出就得从n-1, n-1开始找。
能问一下为什么吗
我试着顺着找,没有搞定
hhhh 谢谢老哥, 我也这样更新path, 害我想了好久,