计蒜客 迷宫
按常规套路得的来,加个传送功能就没了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char mg[1005][1005]; 4 int vis[1005][1005]; 5 int con[105][4]; 6 int min_dis=0x3f3f3f3f; 7 int yes; 8 struct node{ 9 int x; 10 int y; 11 int step; 12 node(int x,int y,int step) 13 { 14 this->x=x; 15 this->y=y; 16 this->step=step; 17 } 18 }; 19 int n,m,q,tx,ty; 20 int dir[][2]={{0,1},{1,0},{0,-1},{-1,0}}; 21 bool judge(int x,int y) 22 { 23 if(x>0&&x<=n&&y>0&&y<=m) 24 { 25 if(mg[x][y]=='.'&&vis[x][y]==0) 26 return true; 27 else 28 return false; 29 } 30 return false; 31 } 32 int main() 33 { 34 cin>>n>>m; 35 for(int i=1;i<=n;++i) 36 for(int j=1;j<=m;++j) 37 cin>>mg[i][j]; 38 cin>>q; 39 for(int i=0;i<q;++i) 40 for(int j=0;j<4;++j) 41 cin>>con[i][j]; 42 cin>>tx>>ty; 43 queue<node> v; 44 v.push(node(1,1,0)); 45 vis[1][1]=1; 46 while(!v.empty()) 47 { 48 node now = v.front(); 49 int x = now.x; 50 int y=now.y; 51 int flag=0; 52 if(mg[x][y]=='*') 53 { 54 v.pop(); 55 continue; 56 } 57 if(x==tx&&y==ty) 58 { 59 if(now.step<min_dis) 60 min_dis=now.step; 61 vis[x][y]==0; 62 v.pop(); 63 yes=1; 64 continue; 65 } 66 for(int i=0;i<q;++i) 67 { 68 if(x==con[i][0]&&y==con[i][1]) 69 { 70 v.push(node(con[i][2],con[i][3],now.step)); 71 flag=1; 72 break; 73 } 74 } 75 if(flag==0) 76 { 77 for(int i=0;i<4;++i) 78 { 79 if(judge(x+dir[i][0],y+dir[i][1])) 80 { 81 v.push(node(x+dir[i][0],y+dir[i][1],now.step+1)); 82 vis[x+dir[i][0]][y+dir[i][1]]=1; 83 } 84 } 85 } 86 v.pop(); 87 } 88 if(yes==1) 89 cout<<min_dis<<endl; 90 else 91 cout<<"No solution"; 92 return 0; 93 }