1 #define DeBUG
2 #include <iostream>
3 #include <cstdio>
4 #include <cstring>
5 #include <cmath>
6 #include <cstdlib>
7 #include <algorithm>
8 #include <vector>
9 #include <stack>
10 #include <queue>
11 #include <string>
12 #include <set>
13 #include <sstream>
14 #include <map>
15 #include <bitset>
16 #include <windows.h>
17 using namespace std ;
18 #define zero {0}
19 #define INF 2000000000
20 #define EPS 1e-6
21 typedef long long LL;
22 #define WIDTH 16
23 #define HEIGHT 10
24 const double PI = acos(-1.0);
25 inline int sgn(double x)
26 {
27 return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1);
28 }
29 #define n 80
30 int mp[n+1][n+1];
31 const short shop_map[10][16] = {
32 { 1, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254
33 },
34 { 2, 3, 4, 5, 0, 6, 75, 7, 8, 73, 9, 10, 0, 11, 254, 254
35 },
36 { 39, 254, 254, 254, 254, 254, 52, 254, 254, 58, 254, 63, 254, 11, 0, 66
37 },
38 { 40, 254, 254, 254, 254, 254, 53, 254, 254, 58, 254, 0, 254, 254, 254, 67
39 },
40 { 41, 12, 13, 14, 77, 15, 0, 16, 17, 74, 18, 19, 20, 76, 21, 67
41 },
42 { 42, 254, 254, 254, 47, 254, 54, 254, 254, 59, 254, 254, 254, 64, 254, 68
43 },
44 { 43, 22, 23, 24, 48, 25, 55, 26, 0, 60, 27, 28, 0, 65, 29, 69
45 },
46 { 44, 254, 254, 254, 49, 254, 56, 254, 254, 61, 254, 254, 254, 254, 254, 70
47 },
48 { 45, 30, 31, 32, 50, 33, 57, 34, 0, 62, 35, 36, 37, 0, 38, 71
49 },
50 { 46, 254, 254, 254, 51, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 72
51 }
52 };
53 char road[100][100];
54 /**
55 * [Dijkstra description]
56 * @param mp 权值矩阵,从1开始
57 * @param n 点数
58 * @param s 起始点
59 * @param t 终点
60 * @param path 起始点到各点的路(前驱)
61 * @return 起点到终点的最短长度
62 */
63 int Dijkstra(int s,int t, int path[])
64 {
65 int i,j,w,minc;
66 bool visit[n+1];
67 int price[n+1];
68 for(i=1; i<=n; i++)
69 visit[i]=false;
70 for(i=1; i<=n; i++)
71 {
72 price[i]=mp[s][i];
73 path[i]=s;
74 }
75 visit[s]=true;
76 price[s]=0;
77 //path[s]=0;
78 for(i=1; i<n; i++)
79 {
80 minc=INF;
81 w=0;
82 for(j=1; j<=n; j++)
83 if((visit[j]==false)&&(minc>=price[j]))
84 {
85 minc=price[j];
86 w=j;
87 }
88 visit[w]=true;
89 for(j=1; j<=n; j++)
90 if((visit[j]==false)&&(mp[w][j]!=INF)&&(price[j]>price[w]+mp[w][j]))
91 {
92 price[j]=price[w]+mp[w][j];
93 path[j]=w;
94 }
95 }
96 return price[t];
97 }
98 int dir[4][2]= {-1,0,1,0,0,-1,0,1};
99 void init()
100 {
101 for(int i=1; i<=n; i++)
102 {
103 for(int j=1; j<=n; j++)
104 {
105 mp[i][j]=INF;
106 }
107 }
108 memset(road,0,sizeof(road));
109 int w;
110 for(int i=0; i<10; i++)
111 {
112 for(int j=0; j<16; j++)
113 {
114 for(int k=0; k<4; k++)
115 {
116 w=1;
117 int nowx=i;
118 int nowy=j;
119 if(shop_map[i][j]==254)
120 {
121 road[i+1][j+1]='#';
122 }
123 nowx+=dir[k][0];
124 nowy+=dir[k][1];
125 while(shop_map[nowx][nowy]==0&&nowx>=0&&nowy>=0&&nowx<HEIGHT&&nowy<WIDTH)
126 {
127 w++;
128 nowx+=dir[k][0];
129 nowy+=dir[k][1];
130 }
131 if(nowx<0||nowy<0||nowx>=HEIGHT||nowy>=WIDTH||shop_map[nowx][nowy]==254)
132 continue;
133 int a=shop_map[i][j];
134 int b=shop_map[nowx][nowy];
135 if(a>=1&&a<=n&&b>=1&&b<=n)
136 {
137 mp[a][b]=1;
138 mp[b][a]=1;
139 }
140 }
141 }
142 }
143 }
144 int main()
145 {
146 #ifdef DeBUGs
147 //freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin);
148 freopen("C:\\Users\\Sky\\Desktop\\dabiao.txt","w",stdout);
149 #endif
150 int m;
151 int path[n+1];
152 init();
153 int s=1;
154 int t=7;
155 int value=Dijkstra(s,t,path);
156
157
158 //////////////生成地图权值数据
159 // printf("%d\n", n);
160 // printf("{");
161 // for(int i=0;i<n;i++)
162 // {
163 // printf("{" );
164 // printf("%d", mp[i][0]);
165 // for(int j=1;j<n;j++)
166 // {
167 // printf(",%d",mp[i][j]==INF?-1:mp[i][j]);
168 // }
169 // printf("},\n");
170 // }
171 // printf("};");
172
173
174 /////////测试用
175 for(int i=1; i<=n; i++)
176 {
177 int k=i;
178 char nowroad[100][100];
179 memcpy(nowroad,road,sizeof(nowroad));
180 nowroad[1][1]='*';
181 while(k!=s)
182 {
183 //printf("%d<--",k);
184 for(int i=0;i<10;i++)
185 for(int j=0;j<16;j++)
186 {
187 if(shop_map[i][j]==k)
188 {
189 nowroad[i+1][j+1]='*';
190 }
191 }
192 k=path[k];
193 }
194 printf("-------------------- %d\n",i);
195 for(int i=1;i<=HEIGHT;i++)
196 {
197 for(int j=1;j<=WIDTH;j++)
198 {
199 printf("%c", nowroad[i][j]);
200 }
201 printf("\n");
202 }
203 Sleep(1000);
204 //printf("%d\n",s);
205 }
206 printf("%d\n", value);
207 return 0;
208 }