http://www.lydsy.com/JudgeOnline/problem.php?id=1627
网格图,给出起点,终点,障碍,求最短路.
分析
简单的宽搜.
1 #include <bits/stdc++.h> 2 using namespace std; 3 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k;} 4 5 const int maxn=1000+5; 6 int n,x,y; 7 int go[][2]={0,1,0,-1,1,0,-1,0}; 8 bool mark[maxn][maxn]; 9 struct node{ 10 int x,y,t; 11 node(){} 12 node(int x,int y,int t):x(x),y(y),t(t){} 13 }q[maxn*maxn]; 14 inline void bfs(){ 15 int L,R; 16 q[L=R=1]=node(500,500,0); 17 while(L<=R){ 18 node t=q[L++]; 19 for(int i=0;i<4;i++){ 20 int tx=t.x+go[i][0],ty=t.y+go[i][1]; 21 if(tx>=0&&tx<=1000&&ty>=0&&ty<=1000&&!mark[tx][ty]){ 22 if(tx==x+500&&ty==y+500){ printf("%d\n",t.t+1); return; } 23 mark[tx][ty]=true; 24 q[++R]=node(tx,ty,t.t+1); 25 } 26 } 27 } 28 } 29 int main(){ 30 read(x); read(y); read(n); 31 for(int i=1,tx,ty;i<=n;i++){ 32 read(tx); read(ty); 33 mark[tx+500][ty+500]=true; 34 } 35 bfs(); 36 return 0; 37 }