Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14260 Accepted Submission(s): 6930php
1 //Author:LanceYu 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<cstdio> 6 #include<fstream> 7 #include<iosfwd> 8 #include<sstream> 9 #include<fstream> 10 #include<cwchar> 11 #include<iomanip> 12 #include<ostream> 13 #include<vector> 14 #include<cstdlib> 15 #include<queue> 16 #include<set> 17 #include<ctime> 18 #include<algorithm> 19 #include<complex> 20 #include<cmath> 21 #include<valarray> 22 #include<bitset> 23 #include<iterator> 24 #define ll long long 25 using namespace std; 26 const double clf=1e-8; 27 //const double e=2.718281828; 28 const double PI=3.141592653589793; 29 const int MMAX=2147483647; 30 //priority_queue<int>p; 31 //priority_queue<int,vector<int>,greater<int> >pq; 32 int n,m,map[101][101]; 33 int vis[101][101]; 34 int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}}; 35 struct node 36 { 37 int x,y,t,step; 38 }; 39 40 int bfs(int a,int b,int x,int y) 41 { 42 int i; 43 queue<node> q; 44 while(!q.empty()) 45 q.pop(); 46 q.push(node{a,b,6,0});//開始也能回來再走一次vis保持0 47 while(!q.empty()) 48 { 49 node t=q.front(); 50 q.pop(); 51 if(t.x==x&&t.y==y) 52 return t.step; 53 if(t.t<=1)//會爆炸的狀況扔掉 54 continue; 55 for(int i=0;i<4;i++) 56 { 57 int dx=t.x+dir[i][0]; 58 int dy=t.y+dir[i][1]; 59 if(dx>=0&&dy>=0&&dx<n&&dy<m&&!vis[dx][dy]&&(map[dx][dy]==1||map[dx][dy]==2)||map[dx][dy]==3)//2也有可能重複走過 60 { 61 q.push(node{dx,dy,t.t-1,t.step+1});//此處能夠重複走故vis不進行賦值 62 } 63 if(dx>=0&&dy>=0&&dx<n&&dy<m&&!vis[dx][dy]&&map[dx][dy]==4) 64 { 65 vis[dx][dy]=1; 66 q.push(node{dx,dy,6,t.step+1});//由於是直接歸零,不必重複走故直接把vis變成1 67 } 68 } 69 } 70 return -1; 71 } 72 int main() 73 { 74 int t,a,b,x,y; 75 cin>>t; 76 while(t--) 77 { 78 scanf("%d%d",&n,&m); 79 memset(vis,0,sizeof(vis)); 80 for(int i=0;i<n;i++) 81 { 82 for(int j=0;j<m;j++) 83 { 84 scanf("%d",&map[i][j]); 85 if(map[i][j]==2)//記錄起點 86 { 87 a=i; 88 b=j; 89 } 90 if(map[i][j]==3)//記錄終點 91 { 92 x=i; 93 y=j; 94 } 95 } 96 } 97 int ans=bfs(a,b,x,y); 98 printf("%d\n",ans); 99 } 100 return 0; 101 }
Notes:思想要求較高node
PS:筆者在作這道題的時候把bfs裏面的兩個判斷語句弄反了,WA了好屢次,可能這就是菜吧ios
2018-11-16 05:09:49 Author:LanceYuui