http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4434
没有用队列,疯狂找不到bug,后来发现很简单的判断时==n和m了,本来心花怒放,测试数据也过了。然而,呜呼,许久不见的re;
好的,re,re,重新,重新!!
然而,不死心的在开更大一点,发现是WA。
那什么时候bfs用数组就行了呢。。
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 int fa[4][2]={{-1,0},{0,-1},{0,1},{1,0}}; 9 char mp[505][505]; 10 int ma[505][505],n,m,r,s; 11 int ans; 12 struct node 13 { 14 int x,y,step; 15 }v[100000]; 16 bool pan(int x,int y) 17 { 18 if(x<0||y<0||x>=n||y>=m) return false; 19 return true; 20 } 21 void bfs() 22 { 23 v[r].x=0; 24 v[r].y=0; 25 v[r].step=0; 26 ma[0][0]=1; 27 r++;s=0; 28 int d=0; 29 while(s<r) 30 { 31 for(int i=0;i<4;i++) 32 { 33 int x=v[s].x+fa[i][0]; 34 int y=v[s].y+fa[i][1]; 35 if(pan(x,y)&&ma[x][y]==0) 36 { 37 if(x==n-1&&y==m-1) 38 { 39 ans=v[s].step+1; 40 ma[x][y]=1; 41 d=1; 42 break; 43 } 44 else if(mp[x][y]==‘.‘) 45 { 46 v[r].x=x; 47 v[r].y=y; 48 v[r].step=v[s].step+1; 49 r++; 50 ma[x][y]=1; //各种路里mark不会相冲突吗 51 } 52 } 53 54 } 55 if(d) break; 56 s++; 57 } 58 } 59 int main() 60 { 61 int t; 62 scanf("%d",&t); 63 while(t--) 64 { 65 scanf("%d%d",&n,&m); 66 for(int i=0;i<n;i++) 67 scanf("%s",mp[i]); 68 memset(ma,0,sizeof(ma)); 69 r=0; 70 ans=0; 71 bfs(); 72 printf("%d\n",ans); 73 } 74 return 0; 75 }
RE,数组表队列
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef pair<int,int>node; //pair!! first 4 int fa[4][2]={{-1,0},{0,-1},{0,1},{1,0}}; 5 char mp[505][505]; 6 int ma[505][505],n,m; 7 void bfs() 8 { 9 queue<node>q; 10 node now={1,1}; 11 ma[1][1]=1; 12 while(!q.empty()) q.pop(); //clear 13 q.push(now); 14 while(!q.empty()) 15 { 16 now=q.front(); 17 q.pop(); 18 for(int i=0;i<4;i++) 19 { 20 int x=now.first+fa[i][0]; //pair 这里可以define 21 int y=now.second+fa[i][1]; 22 if(ma[x][y]!=0||!x||!y||x==n+1||y==m+1||mp[x][y]==‘*‘)//这了的!x 23 continue; 24 ma[x][y]=ma[now.first][now.second]+1; //太**了,用标记顺便当step,充分利用 25 if(x==n&&y==m) 26 { 27 printf("%d\n",ma[x][y]); 28 return; 29 } 30 q.push({x,y}); 31 } 32 33 } 34 puts("-1"); //把不可能的结果放在这里,注意位置 35 } 36 int main() 37 { 38 int t; 39 scanf("%d",&t); 40 while(t--) 41 { 42 scanf("%d%d",&n,&m); 43 for(int i=1;i<=n;i++) 44 scanf("%s",mp[i]+1); //指针,不从第一个位置开始读 45 memset(ma,0,sizeof(ma)); 46 bfs(); 47 } 48 return 0; 49 }
学长写,虽然好像不兼容过不了,但是太厉害了!!
1 #pragma GCC diagnostic error "-std=c++11" 2 #include<bits/stdc++.h> 3 using namespace std; 4 //typedef pair<int,int>node; //pair!! first 5 int fa[4][2]={{-1,0},{0,-1},{0,1},{1,0}}; 6 char mp[505][505]; 7 int ma[505][505],n,m; 8 struct node{ 9 int x,y; 10 }; 11 void bfs() 12 { 13 queue<node>q; 14 node now; 15 now.x=1; 16 now.y=1; 17 ma[1][1]=1; 18 while(!q.empty()) q.pop(); //clear 19 q.push(now); 20 while(!q.empty()) 21 { 22 now=q.front(); 23 q.pop(); 24 for(int i=0;i<4;i++) 25 { 26 int x=now.x+fa[i][0]; 27 int y=now.y+fa[i][1]; 28 if(ma[x][y]!=0||!x||!y||x==n+1||y==m+1||mp[x][y]==‘*‘)//这了的!x 29 continue; 30 ma[x][y]=ma[now.x][now.y]+1; //太**了,用标记顺便当step,充分利用 31 if(x==n&&y==m) 32 { 33 printf("%d\n",ma[x][y]-1); 34 return; 35 } 36 node no; 37 no.x=x; 38 no.y=y; 39 q.push(no); 40 } 41 42 } 43 puts("-1"); //把不可能的结果放在这里,注意位置 44 } 45 int main() 46 { 47 int t; 48 scanf("%d",&t); 49 while(t--) 50 { 51 scanf("%d%d",&n,&m); 52 for(int i=1;i<=n;i++) 53 scanf("%s",mp[i]+1); //指针,不从第一个位置开始读 54 memset(ma,0,sizeof(ma)); 55 bfs(); 56 } 57 return 0; 58 }
pair不能用后 改成struct
原文地址:https://www.cnblogs.com/XXrll/p/10121580.html
时间: 2024-10-29 03:18:57