01迷宫

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

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  }

好了,就是这样。

 

 

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

 

posted @ 2019-03-03 20:38  Simex  阅读(289)  评论(0编辑  收藏  举报