最远距离

最远距离


【Description】
whitecloth 有一块矩形土地,被分为N*M 块1*1 的小格子。
有的格子含有障碍物。
如果从格子A 可以走到格子B,那么两个格子的距离就为两个格子中
心的欧几里德距离。
如果从格子A 不可以走到格子B,就没有距离。
如果格子X 和格子Y 有公共边,并且X 和Y 均不含有障碍物,就可
以从X 走到Y。
如果whitecloth 可以移走T 块障碍物,求所有格子间的最大距离。
保证移走T 块障碍物以后,至少有一个格子不含有障碍物。
【Input】
第一行包含三个整数,N M T。
接下来有N 行,每行一个长度为M 的字符串,'0'表示空格子,'1'表
示该格子含有障碍物。
【Output】
一个数表示答案,保留6 位小数
【Sample Input】
3 3 0
001
001
110
【Sample Output】
1.414214
【Hint】
对于20%的数据,满足1 <= N,M <= 30 ,0 <= T <= 0
对于40%的数据,满足1 <= N,M <= 30 ,0 <= T <= 2

把障碍物的权值看做1,求出任意两点间最短距离,之后枚举点对,在最短距离不超过?的前提下更新最大欧几里得距离。

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<cmath>
 6 using namespace std;
 7 int n,m,T;
 8 char key;
 9 int map[35*35];
10 int dx[35*35][35*35],head[35*35],cnt;
11 int X[35*35];
12 int Y[35*35];
13 double ans;
14 struct Node{
15     int en,to,val;
16 }eda[55000];
17 bool vis[35*35];
18 void Add(int x,int y,int z){
19     eda[++cnt].en=y;
20     eda[cnt].to=head[x];
21     head[x]=cnt;
22     eda[cnt].val=z;
23 }
24 struct At{
25     int id,dis;
26     bool friend operator < (At a,At b){
27         return a.dis>b.dis;
28     }
29 };
30 void SPFA(int x){
31     dx[x][x]=map[x];
32     vis[x]=1;
33     priority_queue<At>st;
34     At ls;
35     ls.id=x;
36     ls.dis=0;
37     st.push(ls);
38     while(!st.empty()){
39         int u=st.top().id;
40         st.pop();
41         vis[u]=0;
42         for(int i=head[u];i;i=eda[i].to){
43             int y=eda[i].en;
44             if(dx[x][y]>dx[x][u]+eda[i].val){
45             //    if(x==5&&y==7) printf("%d %d %d\n",u,dx[x][u],eda[i].val);
46                 dx[x][y]=dx[x][u]+eda[i].val;
47                 if(!vis[y]){
48                     vis[y]=0;
49                     ls.id=y;
50                     ls.dis=dx[x][y];
51                     st.push(ls);
52                 }
53             }
54         }
55     }
56 }
57 int main(){
58     memset(dx,30,sizeof(dx));
59     scanf("%d%d%d",&n,&m,&T);
60     for(int i=1;i<=n;i++){
61         for(int j=1;j<=m;j++){
62             cin>>key;
63             if(key=='1') map[(i-1)*m+j]=1;
64             X[(i-1)*m+j]=i;
65             Y[(i-1)*m+j]=j;
66         }
67     }
68     for(int i=1;i<=n*m;i++){
69         if(i%m!=1){
70             Add(i,i-1,map[i-1]);
71         }
72         if(i%m!=0){
73             Add(i,i+1,map[i+1]);
74         }
75         if(i>m){
76             Add(i,i-m,map[i-m]);
77         }
78         if(i<(n-1)*m){
79             Add(i,i+m,map[i+m]);
80         }
81     }
82     for(int i=1;i<=n*m;i++){
83         SPFA(i);
84     }
85     for(int i=1;i<=n*m;i++){
86         for(int j=i+1;j<=n*m;j++){
87             if(dx[i][j]<=T){//printf("dx[%d][%d]= %d\n",i,j,dx[i][j]);
88                 if(ans<sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j])))
89                     ans=sqrt((X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]));
90             }
91         }
92     }
93     printf("%.6lf",ans);
94 }
View Code

 

posted @ 2015-10-11 18:34 Lenicodes 阅读( ...) 评论( ...) 编辑 收藏
<think>嗯,用户的问题是关于华为机试中计算远距离的算法或解题思路。我需要先回想一下之前处理过的类似问题,以及相关的引用内容。用户提供的三个引用中,引文1和3都提到了积木远距离远足迹的问题,这可能涉及到数组或字符串中的元素位置计算。 首先,我需要明确这类题目的常见形式。通常,这类问题要求找出数组中两个相同元素之间的大距离,或者在某些条件下找到两点之间的远距离。例如,在积木问题中,可能给定一个数组,每个元素代表一种积木类型,需要找到两个相同类型积木的远间隔。 根据引用1的内容,解题思路可能涉及使用哈希表来记录每个元素第一次和后一次出现的位置,然后计算它们的差值,找出大的那个。这种方法的时间复杂度是O(n),空间复杂度也是O(n),应该比较高效。例如,对于数组中的每个元素,用哈希表存储其索引,然后遍历哈希表找到大差值。 另外,引用3提到远足迹问题,可能需要处理坐标点的计算,比如找出两个点之间的大欧氏距离。这种情况下,可能需要遍历所有点对,计算它们之间的距离,然后找出大值。不过这种方法的时间复杂度是O(n²),对于大数据量可能不适用,但机试题目可能数据规模不大,允许这种解法。 接下来,用户可能需要具体的解题步骤和代码示例。比如,针对积木问题,步骤可能是:遍历数组,记录每个元素的首次和末次出现位置;然后遍历哈希表,计算每个元素的末次减首次的距离,取大值。而对于坐标问题,可能需要遍历所有可能的点对,计算距离,记录大值。 需要注意的是,华为机试可能对代码的效率和正确性有较高要求,所以需要优化算法。例如,使用哈希表来减少时间复杂度。同时,代码需要处理边界情况,比如数组中没有重复元素时返回0或者特定值。 此外,引用2提醒考生要修改代码以避免查重,所以在示例代码中需要注明提醒用户自行调整变量名和结构。例如,在Python中使用字典记录位置,而在C++中使用unordered_map。 后,生成的相关问题应该围绕这些算法的优化、应用场景以及不同变体的题目展开,帮助用户全面理解这类问题。</think># 华为机试“远距离”类算法题解 ## 一、问题类型分析 华为机试中"远距离"问题通常分为两类: 1. **相同元素远间距**:如积木问题中求相同类型积木的远间隔 2. **坐标系远距离**:如足迹问题中求二维/三维坐标点的大欧氏距离 ## 二、通用解题框架 ### 1. 相同元素远间距(时间复杂度O(n)) ```python def max_distance(arr): pos_dict = {} max_dist = 0 for idx, num in enumerate(arr): if num not in pos_dict: pos_dict[num] = [idx, idx] # [首次位置, 末次位置] else: pos_dict[num][1] = idx for k in pos_dict: max_dist = max(max_dist, pos_dict[k][1] - pos_dict[k][0]) return max_dist ``` **优化点**:遍历时实时计算可节省空间,无需存储所有位置[^1] ### 2. 坐标点远距离(时间复杂度O(n²)) ```python def max_euclidean(points): max_dist = 0 n = len(points) for i in range(n): for j in range(i+1, n): dx = points[i][0] - points[j][0] dy = points[i][1] - points[j][1] dist = dx*dx + dy*dy # 不开方提高效率 max_dist = max(max_dist, dist) return max_dist**0.5 ``` **注意**:机试中可能要求输出整数距离的平方值[^3] ## 三、华为真题示例 ### 真题1:积木远距离 **题目描述**:给定数组表示积木类型,求相同类型积木的大间距 ```python # 输入样例:[1,2,3,1,4,2,1] # 输出:5(索引0到6) def solution(arr): first = dict() max_gap = 0 for i, v in enumerate(arr): if v not in first: first[v] = i else: max_gap = max(max_gap, i - first[v]) return max_gap ``` ### 真题2:远足迹 **题目描述**:给定坐标列表,求欧氏距离大的两点 ```python def solution(coords): max_sq = 0 res = [] for i in range(len(coords)): for j in range(i+1, len(coords)): dx = coords[i][0]-coords[j][0] dy = coords[i][1]-coords[j][1] curr_sq = dx*dx + dy*dy if curr_sq > max_sq or (curr_sq == max_sq and sorted([coords[i], coords[j]]) < res): max_sq = curr_sq res = sorted([coords[i], coords[j]]) return res ``` ## 四、优化技巧 1. **哈希表预存法**:对重复元素问题,只需记录首次出现位置 2. **双指针法**:适用于部分有序数组的场景 3. **剪枝策略**:在坐标问题中可先计算x/y极值点的组合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值