1 条题解
-
1
题目很大,简单到炸
方法思路:
我知道你们不会看-
数据结构:
- 使用
point
结构体存储当前坐标。 - 使用二维字符数组
a
存储迷宫。 - 使用二维布尔数组
vis
记录访问状态。
- 使用
-
BFS算法:
- 从起点
S
开始,使用队列进行广度优先搜索。 - 每次从队列中取出一个点,检查是否是终点
E
。 - 如果不是终点,则向四个方向扩展,将可行的新点加入队列,并标记为已访问。
- 从起点
-
输入输出:
- 读取测试用例数量
T
。 - 对于每个测试用例,读取迷宫尺寸
n
和m
,然后读取迷宫内容。 - 使用
memset
重置vis
数组。 - 调用
bfs
函数并输出结果,如果无法到达终点则输出oop!
。
- 读取测试用例数量
好了,话不说,直接上代码
我知道你们只看这里//万物皆可dfs #include<bits/stdc++.h> using namespace std; #define endl "\n" #define int long long int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; //int dx[]={-1,1,0,0,-1,1,-1,1}; //int dy[]={0,0,-1,1,-1,1,1,-1}; struct point{ int x; int y; }; const int N=1e5+5; char a[205][205]; int vis[205][205]; int n,m; int bfs(int x,int y){ queue<point> q; q.push({x,y}); while(!q.empty()){ point p=q.front(); q.pop(); int x=p.x; int y=p.y; if(a[x][y]=='E'){ return vis[x][y]-1; } for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=0 && nx<n && ny>=0 && ny<m && !vis[nx][ny] && a[nx][ny]!='#'){ vis[nx][ny]=vis[x][y]+1; q.push({nx,ny}); } } } return -1; } signed main(){ std::ios::sync_with_stdio(false);cin.tie(0); //freopen(".in","r",stdin); //freopen(".out","w",stdout); int T; cin>>T; while(T--){ cin>>n>>m; int sx,sy; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; if(a[i][j]=='S'){ sx=i;sy=j; } } } vis[sx][sy]=1; int ans=bfs(sx,sy); if(ans==-1){ cout<<"oop!"; } else { cout<<ans; } cout<<endl; } return 0; }
最后提醒一下老师给的样例
很恶心有坑,你的vis
数组每次都要重置(代码直接贴这儿,不用谢我memset(vis,0,sizeof(vis));
),到时候vis
没重置WA别说我没提醒你严禁拷贝
(谁TM拷贝是**) -
信息
- ID
- 246
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 24
- 已通过
- 10
- 上传者