ural 1119 Metro
http://acm.timus.ru/problem.aspx?space=1&num=1119
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #define maxn 1010 7 using namespace std; 8 9 int head[maxn],e,n,m; 10 int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; 11 bool vis[maxn][maxn]; 12 bool visi[maxn][maxn]; 13 double step; 14 15 struct node 16 { 17 int x,y; 18 double step; 19 }st,st1,st2; 20 21 void bfs(node st) 22 { 23 queue<node>q; 24 st.step=0.0; 25 q.push(st); 26 memset(visi,false,sizeof(visi)); 27 visi[st.x][st.y]=true; 28 while(!q.empty()) 29 { 30 st1=q.front(); 31 q.pop(); 32 if(st1.x==m&&st1.y==n) {step=st1.step;return;} 33 for(int i=0; i<4; i++) 34 { 35 int xx=st1.x+dir[i][0]; 36 int yy=st1.y+dir[i][1]; 37 if(xx>=0&&xx<=m&&yy>=0&&yy<=n&&!visi[xx][yy]) 38 { 39 st2.step=st1.step+100.0; 40 visi[xx][yy]=true; 41 st2.x=xx; 42 st2.y=yy; 43 q.push(st2); 44 } 45 } 46 if(vis[st1.x+1][st1.y+1]&&st1.x+1<=m&&st1.y+1<=n&&st1.x+1>=0&&st1.y+1>=0) 47 { 48 vis[st1.x+1][st1.y+1]=true; 49 st2.x=st1.x+1; 50 st2.y=st1.y+1; 51 st2.step=st1.step+sqrt(2)*100.0; 52 q.push(st2); 53 } 54 } 55 } 56 int main() 57 { 58 int k,a,b; 59 step=0; 60 scanf("%d%d",&n,&m); 61 scanf("%d",&k); 62 memset(vis,false,sizeof(vis)); 63 for(int i=1; i<=k; i++) 64 { 65 scanf("%d%d",&a,&b); 66 vis[b][a]=true; 67 } 68 st.x=0; 69 st.y=0; 70 bfs(st); 71 printf("%.0lf\n",step); 72 return 0; 73 }