王钰宸涵
(ゴテンクス)
1
题目: 智灵班寒假普及±-搜索综合 - 信友队
代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
int n,m,Cx,Cy,Dx,Dy,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char mapa[1005][1005];
struct node{
int x,y;
};
int bfs(){
deque<node>q;
q.push_front({Cx,Cy});
int vis[1005][1005];
memset(vis,-1,sizeof vis);
vis[Cx][Cy]=0;
while(!q.empty()){
node t=q.front();
q.pop_front();
if(t.x==Dx&&t.y==Dy)return vis[t.x][t.y];
for(int i=0;i<4;i++){
int nx=t.x+dx[i],ny=t.y+dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&vis[nx][ny]==-1&&mapa[nx][ny]=='.'){
vis[nx][ny]=vis[t.x][t.y];
q.push_front({nx,ny});
}
}
for(int i=t.x-2;i<=t.x+2;i++){
for(int j=t.y-2;j<=t.y+2;j++){
if(i>0&&i<=n&&j>0&&j<=m&&vis[i][j]==-1&&mapa[i][j]=='.'){
vis[i][j]=vis[t.x][t.y]+1;
q.push_back({i,j});
}
}
}
}
return -1;
}
signed main(){
cin>>n>>m>>Cx>>Cy>>Dx>>Dy;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>mapa[i][j];
cout<<bfs();
i_ak ioi;
}
王钰宸涵
(ゴテンクス)
10
@2345安全卫士 对呀我是贪心,这道题目是一道01BFS模板
1 个赞
王钰宸涵
(ゴテンクス)
13
@2345安全卫士 是的呀这道题目是模板,但是我用的不是普通队列是双向队列
1 个赞
王钰宸涵
(ゴテンクス)
15
按照老师说的改了还是WA40:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
I AK IOI;
int n,m,Cx,Cy,Dx,Dy,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char mapa[1005][1005];
struct node{
int x,y,step;
};
int bfs(){
deque<node>q;
q.push_back({Cx,Cy,0});
bool vis[1005][1005];
memset(vis,0,sizeof vis);
vis[Cx][Cy]=1;
while(!q.empty()){
node t=q.front();
q.pop_front();
if(t.x==Dx&&t.y==Dy)return t.step;
for(int i=0;i<4;i++){
int nx=t.x+dx[i],ny=t.y+dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=m&&vis[nx][ny]==0&&mapa[nx][ny]=='.'){
vis[nx][ny]=1;
q.push_front({nx,ny,t.step});
}
}
for(int i=t.x-2;i<=t.x+2;i++){
for(int j=t.y-2;j<=t.y+2;j++){
if(i>0&&i<=n&&j>0&&j<=m&&vis[i][j]==0&&mapa[i][j]=='.'){
vis[i][j]=1;
q.push_back({i,j,t.step+1});
}
}
}
}
return -1;
}
signed main(){
cin>>n>>m>>Cx>>Cy>>Dx>>Dy;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>mapa[i][j];
cout<<bfs();
i_ak ioi;
}
我用的不是双端队列
我是先把不用魔法走的情况入队,再把用魔法走的情况入队,同时如果用魔法能实现相同的上下左右移动,则跳过
虽然我也WA40
王钰宸涵
(ゴテンクス)
17
e。我静静(难兄难弟呀,就我们两个没有做出来 @huangfeidong
鲁纶
(鲁纶)
18
感觉deque加入 step 后,这里 vis[nx][ny]==-1 要改成 t.step < vis[nx][ny] (vis初始化为INF)
后面要改成 t.step+1 < vis[i][j]