#include <iostream>
#define MAX 1000
#define MAX_VALUE MAX*MAX*2 /* 最大值 */
#define N 100
#define M 100
#define NUM_GUEST 3
typedef struct point {
int x;
int y;
} point;
int map[MAX][MAX]; // 最大网格
point queue[MAX*MAX/4];
int guest[NUM_GUEST*2]={99,99,88,88,77,77};
int n,m,k,z,h;
int begin = 0;
int end = 0;
int isEmpty (void)
{
return end == begin;
}
void push (point value)
{
queue [end] = value;
end ++;
}
point pop (void)
{
begin ++;
return queue [begin-1];
}
void intput (void)
{
n = N; // row
m = M; // column;
k = 4; // 维修点个数
//map[1][1] = 0; map[2][2] = 0; map[3][3] = 0; map[4][4] = 0;
z = 1; // 故障点
map[0][0] = -1;
h = NUM_GUEST; // 客户数
}
void show (int n)
{
int y, x;
for (y=0;y<n;y++)
{
for (x=0;x<n;x++)
printf ("%d\t", map[x][y]);
printf ("\n");
}
}
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv)
{
int i;
int y, x;
point tmp;
int cost = 0;
int derection[4][2] = {{0, 1}, {0,-1}, {-1,0}, {1,0}}; /* 上、下、左、右 */
intput ();
/* init map */
for (x=0;x<m;x++)
for (y=0;y<n;y++)
map[x][y] = MAX_VALUE;
// map[1][1] = 0; map[2][2] = 0; map[3][3] = 0; map[4][4] = 0;
x = 1, y = 1;
tmp.x = x;
tmp.y = y;
push (tmp); map[x][y] = 0;
x = 2, y = 2;
tmp.x = x;
tmp.y = y;
push (tmp); map[x][y] = 0;
x = 3, y = 3;
tmp.x = x;
tmp.y = y;
push (tmp); map[x][y] = 0;
x = 4, y = 4;
tmp.x = x;
tmp.y = y;
push (tmp); map[x][y] = 0;
map[0][0] = -1;
while (!isEmpty())
{
tmp = pop ();
x = tmp.x, y = tmp.y;
//printf (" pop: (%d,%d)\t", x, y);
for (i=0; i<4;i++)
{
int yi, xi;
xi = x + derection[i][0];
yi = y + derection[i][1];
//printf (" visit0: (%d,%d)\t", xi, yi);
if (xi < 0 || xi > m || yi < 0 || yi > n)
continue;
//printf (" visit1: (%d,%d)\t", xi, yi);
if (map[xi][yi] == -1)
continue;
// 如果每个维修点起始值一致,且路径没见加权,则首次需要更新的结点必然是未访问的结点
if (map[xi][yi] > map[x][y] + 2)
{
map[xi][yi] = map[x][y] + 2;
tmp.x = xi;
tmp.y = yi;
push (tmp);
}
}
}
show (10);
for (i=0; i<NUM_GUEST; i++)
{
x = guest[2*i], y = guest[2*i+1];
cost = cost + map[x][y];
}
printf ("%d\n", cost);
return 0;
}