01迷宫

本文分享了一道洛谷上的经典BFS题目(P1141),并详细介绍了如何通过优化避免TLE(超时)。作者通过实践发现,在BFS算法中,对数组大小的合理设定及对特定条件的优化处理,可以显著提升算法效率,避免超时错误。文章附带了完整的代码示例,对于理解BFS算法及其优化策略具有较高的参考价值。
摘要由CSDN通过智能技术生成

一定是没有拜初音未来,竟然卡了我半个小时

MIKUMIKUMIKUMIKU

 

题目:https://www.luogu.org/problemnew/show/P1141

很简单的BFS,但是有三个点不优化就TLE!!!!

 

 

真的很讨厌的诶

 

 

以下是代码,希望帮助到你

 

 1 //被这题卡了半个小时,数组开小了QWQ 
 2 //怎么说,很有趣的题 
 3 
 4 #include<iostream>
 5 #include<queue>
 6 #include<bits/stdc++.h>
 7 
 8 using namespace std;
 9 
10 queue <int> q;
11 queue <int> q1;
12 long int mapp[10100][10100],vis[10050][10005];//不言而喻,存图与记录拜访 
13 int step=0;//当前步数 
14 int stepp[100050];//累计每一次步数 
15 int x1[4]={1,0,0,-1};
16 int y5[4]={0,1,-1,0};
17      int n,m;
18      char c;
19      bool boool;
20  int main()
21  {
22 
23      cin>>n>>m;
24      for(int i=1;i<=n;++i){
25              for(int j=1;j<=n;++j){
26                  cin>>c;//在这读图真可怕,gets,getchar死活读不了 
27                  if(c=='1')
28                  mapp[i][j]=1;
29                  else
30                  mapp[i][j]=0;
31              }
32          }//下面是每一次的搜索 
33          for(int k=1;k<=m;++k){
34          int x,y;
35          cin>>x>>y;
36          vis[x][y]=k;
37          step=1;
38          q.push(x);
39          q1.push(y);
40          //初始化中 
41          while(q.size()){
42              if(boool)
43              break;//蒟蒻的弹出方法,因为下面还有个for,只能再判一遍 
44              int u,v;
45              u=q.front(); q.pop();
46              v=q1.front(); q1.pop();//读取队列 
47              for(int i=0;i<4;++i){
48                  int u1=u+x1[i];
49                  int v1=v+y5[i];
50                  if(mapp[u][v]+mapp[u1][v1]==1&& vis[u1][v1]!=k&&u1>=1&&v1>=1&&u1<=n&&v1<=n)
51                  {//在这里,因为是从零走到一或从一走到零,那么这两步的和必然为一
52                  //边界条件判定很明显 
53                      if(vis[u1][v1]>=1)//如果这里已经被拜访过 
54                      {//那么走的最多方位定然和上一次一样 
55                          step=stepp[vis[u1][v1]];//记录中,vis存了是在第几次被拜访
56                          //而stepp则是第几次的步数 
57                          boool=1;
58                          //两个循环,只能这么跳了 
59                          break;
60                      }
61                      else
62                      {
63                      vis[u1][v1]=k;
64                      step++;
65                      q.push(u1);
66                      q1.push(v1);
67                      //压入队列与记录步数与记录拜访 
68                      }
69                  }
70              }
71               
72          }
73          //输出 
74          cout<<step<<endl;
75          stepp[k]=step;//第k次的答案 
76          boool=0;//初始化 
77          
78      }
79      return 0;
80  }

好了,就是这样。

 

 

何不祝我和初音未来在一起

 

转载于:https://www.cnblogs.com/For-Miku/p/10467430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值