最短路项目辅助代码

  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);
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("},
");
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
",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("
");
202         }
203         Sleep(1000);
204         //printf("%d
",s);
205     }
206     printf("%d
", value);
207     return 0;
208 }
View Code
原文地址:https://www.cnblogs.com/Skyxj/p/3464080.html