Sicily/1703. Obstacle Course
2011-07-31 22:06 Min·zc 阅读(219) 评论(0) 编辑 收藏 举报
1 #include <iostream>
2 #include <memory.h>
3 using namespace std;
4 int dis[15630];
5 int vi[15630];
6 int gp[130][130];
7 int n;
8 int time=0;
9 int change(int p,int d)
10 {
11 int x=p/n;
12 int y=p%n;
13 if(d==0)
14 y--;
15 else if(d==1)
16 x--;
17 else if(d==2)
18 y++;
19 else
20 x++;
21 if(x<0||x>n||y<0||y>n)
22 return -1;
23 else
24 return x*n+y;
25 }
26 int ini()
27 {
28 for(int i=0;i<n;i++)
29 for(int j=0;j<n;j++)
30 cin>>gp[i][j];
31 }
32 int dij()
33 {
34 memset(vi,0,sizeof(vi));
35 for(int i=1;i<n*n;i++)
36 dis[i]=999999;
37 dis[0]=0;
38 while(vi[n*n-1]==0)
39 {
40 int min=999999;
41 int t;
42 for(int i=0;i<n*n;i++)
43 if(vi[i]==0&&dis[i]<min)
44 {
45 min=dis[i];
46 t=i;
47 }
48 vi[t]=1;
49 dis[0]=gp[0][0];
50 // cout<<t<<endl;
51 for(int d=0;d<4;d++)
52 {
53 int tem=change(t,d);
54 if(tem!=-1)
55 {
56 int x,y;
57 x=tem/n;
58 y=tem%n;
59 dis[tem]=gp[x][y]+dis[t]<dis[tem]?gp[x][y]+dis[t]:dis[tem];
60 // cout<<tem<<" "<<dis[tem]<<endl;
61 }
62 }
63 }
64 time++;
65 cout<<"Problem "<<time<<": "<<dis[n*n-1]<<endl;
66 }
67 int main()
68 {
69 while(cin>>n&&n!=0)
70 {
71 ini();
72 dij();
73 }
74 }