说来惭愧,第一次真正搞清了BFS
这个题特别像类似走迷宫的题目,主要借助STL中的queue
其中值得关注的几个点是
1该题钟的queue中存放的不是单个int,而是用make_pair(x,y)组成的一个节点,其中first和second分别存放当前点的x坐标和y坐标,这有一点像结构体。
2 第一次WA发生在这里int dx[8] = {1,1,2,2,-1,-1,-2,-2}; int dy[8] = {-2,2,-1,1,2,-2,1,-1};,因为粗心,没有对应上,把dy中的最后一个-1写成了1
3其实这种题更像是一种标准的框架
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,x,y;
cin>>n>>m>>x>>y;
int f[405][405];
bool visit[405][405];
int dx[8] = {1,1,2,2,-1,-1,-2,-2};
int dy[8] = {-2,2,-1,1,2,-2,1,-1};
memset(f,-1,sizeof(f));
memset(visit,false,sizeof(visit));
queue<pair<int,int> > q;
q.push(make_pair(x,y));
visit[x][y] = true;
f[x][y] = 0;
while(!q.empty()){
int xx = q.front().first;
int yy = q.front().second;
q.pop();
for(int i = 0;i < 8;i++){
int u = xx+dx[i];
int v = yy+dy[i];
if(u<1||u>n||v<1||v>m||visit[u][v]){
continue;
}
else{
f[u][v] = f[xx][yy] + 1;
visit[u][v] = true;
q.push(make_pair(u,v));
}
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
printf("%-5d",f[i][j]);
}
if(i != n)
printf("\n");
}
return 0;
}
4最后这一点我仍然没有搞清楚
最开始我是这么写的,我把负数特殊处理了一下,让他后面只输出四个空格,但是仍然WA了
使用cout<<setw(5)还是WA,因为setw(5)认为负数只占一位
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(f[i][j] < 0)
cout<<f[i][j]<<" ";
else
cout<<f[i][j]<<" ";
}
cout<<endl;
}
用洛谷上的题解写法printf("%-5d",f[i][j])就过了,“%-5d”代表输出的这个数字最长只占五位,少的用空格补,左对齐
疑问:ASCII32 和我的空格字符串有什么区别吗?