https://www.acwing.com/problem/content/1103/
搜索题,数据范围为1<=n,m<=200。
所以dfs是必然超时的,时间复杂度为(200*200)!
1 void dfs(PII now,PII e,int step){ 2 if(now==e){ 3 res=min(res,step); 4 return ; 5 } 6 for(int i=0;i<4;i++){ 7 int x=now.x+u[i],y=now.y+v[i]; 8 if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]!='#'){ 9 g[x][y]='#'; 10 dfs({x,y},e,step+1); 11 g[x][y]='.'; 12 } 13 } 14 }
所以得用bfs,时间复杂度为200*200。
1 #include<iostream> 2 #include<climits> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 typedef pair<int,int> PII; 7 const int N=210; 8 char g[N][N]; 9 int n,m; 10 int u[]={-1,0,1,0}; 11 int v[]={0,1,0,-1}; 12 int dist[N][N]; 13 int bfs(PII s,PII e){ 14 memset(dist,-1,sizeof(dist)); 15 queue<PII> q; 16 q.push(s); 17 dist[s.first][s.second]=0; 18 while(q.size()){ 19 PII t=q.front(); 20 q.pop(); 21 for(int j=0;j<4;j++){ 22 int x=t.first+u[j],y=t.second+v[j]; 23 if(x<0||x>=n||y<0||y>=m||g[x][y]=='#') 24 continue; 25 if(dist[x][y]!=-1) 26 continue; 27 dist[x][y]=dist[t.first][t.second]+1; 28 if(make_pair(x,y)==e){ 29 return dist[x][y]; 30 } 31 q.push({x,y}); 32 } 33 } 34 return -1; 35 } 36 int main(void){ 37 int t; 38 cin>>t; 39 while(t--){ 40 cin>>n>>m; 41 PII start,end; 42 for(int i=0;i<n;i++){ 43 for(int j=0;j<m;j++){ 44 cin>>g[i][j]; 45 if(g[i][j]=='S') start={i,j},g[i][j]='#'; 46 if(g[i][j]=='E') end={i,j}; 47 } 48 } 49 int res=bfs(start,end); 50 if(res!=-1) cout<<res<<endl; 51 else cout<<"oop!"<<endl; 52 } 53 return 0; 54 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2020-02-03 P3368树状数组2(树状数组//改段求点)
2020-02-03 P3373 树状数组1(树状数组//改点求段)
2020-02-03 树状数组
2020-02-03 P1197 星球大战(并查集+链式向前星)