华为OJ练习题 -- 135 修理手机 -- 队列的使用

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值