diff --git a/problem3.cpp b/problem3.cpp index eda06d2946992733862ee747171a5dc5ca230afb..28c27ea5d33d750c5f8f6d38ba3ead6afa5621b6 100644 --- a/problem3.cpp +++ b/problem3.cpp @@ -1,19 +1,19 @@ #include -//使用GBK编码 +//浣跨敤GBK缂栫爜 -//随机算法求解最近点对问题 +//闅忔満绠楁硶姹傝В鏈杩戠偣瀵归棶棰 using namespace std; - //点类定义 + //鐐圭被瀹氫箟 struct Point{ double x, y; }; -//正方形定义 +//姝f柟褰㈠畾涔 struct Square { @@ -39,7 +39,7 @@ int HASH(int x, int y){ return x * 100 + y; } -//输入一个点的坐标,映射出一个hash值 +//杈撳叆涓涓偣鐨勫潗鏍囷紝鏄犲皠鍑轰竴涓猦ash鍊 double calculate_distance(int i, int j){ @@ -47,7 +47,7 @@ double calculate_distance(int i, int j){ return sqrt((points[i].x - points[j].x) * (points[i].x - points[j].x) + (points[i].y - points[j].y) * (points[i].y - points[j].y)); } -//计算两点间距离 +//璁$畻涓ょ偣闂磋窛绂 void Into_Hash(int i, double r){ @@ -57,14 +57,14 @@ void Into_Hash(int i, double r){ squares[now_index].point_data = point_to_square[HASH( (int)(points[i].x/r), (int)(points[i].y/r) )]; - //将点和正方形网格做一个互相映射 + //灏嗙偣鍜屾鏂瑰舰缃戞牸鍋氫竴涓簰鐩告槧灏 point_to_square[HASH( (int)(points[i].x/r), (int)(points[i].y/r) )] = now_index ++; } -//更新hash表 +//鏇存柊hash琛 void Renew_Hash(int n, double r){ now_index = 0; @@ -76,9 +76,9 @@ void Renew_Hash(int n, double r){ Into_Hash(i, r); } - +//娣诲姞涓浜涗笢瑗 -//向8个方向以及自身这9个格子搜索 +//鍚8涓柟鍚戜互鍙婅嚜韬繖9涓牸瀛愭悳绱 double Get_len_around(int p, double r){ int x = (int) (points[p].x / r), y = (int) (points[p].y / r), i, j; @@ -86,7 +86,7 @@ double Get_len_around(int p, double r){ double s = 100000.0; for(int k = 0; k < 9; k ++){ - //遍历9个方向(8个邻居以及自身) + //閬嶅巻9涓柟鍚(8涓偦灞呬互鍙婅嚜韬) i = x + direction[k][0], j = y + direction[k][1]; @@ -101,8 +101,8 @@ double Get_len_around(int p, double r){ } vector random_permut_1(int n) -//洗牌函数,生成一个n个数的数组,数组元素∈[0,n-1]然后再打乱 -//返回一个sqrt(n)长度的随机数数组作为随机算法初始网格尺寸的计算尺度 +//娲楃墝鍑芥暟锛岀敓鎴愪竴涓猲涓暟鐨勬暟缁勶紝鏁扮粍鍏冪礌鈭圼0,n-1]鐒跺悗鍐嶆墦涔 +//杩斿洖涓涓猻qrt(n)闀垮害鐨勯殢鏈烘暟鏁扮粍浣滀负闅忔満绠楁硶鍒濆缃戞牸灏哄鐨勮绠楀昂搴 { vector temp; @@ -132,7 +132,7 @@ double Get_Min_Distance(int n){ if (calculate_distance(initial_subset[i], initial_subset[j]) < r){ r = calculate_distance(initial_subset[i], initial_subset[j]); - //更新距离 + //鏇存柊璺濈 } } @@ -141,24 +141,24 @@ double Get_Min_Distance(int n){ double s; if(r < 1e-6 || n < 2) return 0; - //只有一个点,或者第一次就碰巧命中了最小距离(无限接近0) + //鍙湁涓涓偣锛屾垨鑰呯涓娆″氨纰板阀鍛戒腑浜嗘渶灏忚窛绂(鏃犻檺鎺ヨ繎0) Renew_Hash(1, r); - //以r为基准构造正方形网格 + //浠涓哄熀鍑嗘瀯閫犳鏂瑰舰缃戞牸 for(int i = 2; i < n; i ++) if((s = Get_len_around(i, r)) < r){ - //第i个点的方块发现了一个更短距离 + //绗琲涓偣鐨勬柟鍧楀彂鐜颁簡涓涓洿鐭窛绂 r = s; - if(r < 1e-6) return 0;//找到一个接近0的最短距离直接返回 + if(r < 1e-6) return 0;//鎵惧埌涓涓帴杩0鐨勬渶鐭窛绂荤洿鎺ヨ繑鍥 Renew_Hash(i, r); - //依据这个新的更短距离更新哈希表 + //渚濇嵁杩欎釜鏂扮殑鏇寸煭璺濈鏇存柊鍝堝笇琛 } else @@ -173,7 +173,7 @@ int main(){ int n; - printf("请输入飞机的个数1~100:\n"); + printf("璇疯緭鍏ラ鏈虹殑涓暟1~100:\n"); scanf("%d", &n); @@ -183,18 +183,18 @@ int main(){ points[i].x = rand() % 500; points[i].y = rand() % 500; - printf("第%d架飞机的坐标: (%f %f)\n", i, points[i].x, points[i].y); + printf("绗%d鏋堕鏈虹殑鍧愭爣: (%f %f)\n", i, points[i].x, points[i].y); } double ans = Get_Min_Distance(n); - printf("最近距离:%.4lf\n", ans); + printf("鏈杩戣窛绂伙細%.4lf\n", ans); if(ans < 100.0) - printf("有危险存在!"); + printf("鏈夊嵄闄╁瓨鍦紒"); else - printf("安全"); + printf("瀹夊叏"); system("pause");