一定是没有拜初音未来,竟然卡了我半个小时
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 }
好了,就是这样。
何不祝我和初音未来在一起