青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品



May the force be with you!
posts - 52,  comments - 33,  trackbacks - 0


這個題目是老題了,是Northeastern Europe 1996的題目 ,也就是POJ1444。

題目地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1444

這個解法是錯的!!!!比賽時數(shù)據(jù)菜,水過去了~~~

具體解法看Felicia的:http://www.shnenglu.com/Felicia/archive/2008/01/23/41747.html



【題目描述】

Problem A-最短表面距離

by littlekid

Description

一個長方體P={ (x,y,z) | 0<=x<=L, 0<=y<=w, 0<=z<=H },長方體表面有任意兩點(diǎn)

A(x1,y1,z1)B(x2,y2,z2)AB 兩點(diǎn)可由長方體表面的折線連接,求出A B 的最短表面距離。

LWH 和點(diǎn)的坐標(biāo)都是整數(shù),0<=L,W,H<=1000

Input

輸入數(shù)據(jù)有多組,每組包含三行,格式如下:

L W H

x1 y1 z1

x2 y2 z2

輸入以一行“-1 -1 -1”結(jié)束。

Output

對于每組輸入數(shù)據(jù)輸出一行,輸出最短表面距離,要求四舍五入倒小數(shù)點(diǎn)后兩位。

Sample Input

5 5 2

3 1 2

3 5 0

-1 -1 -1

Sample Output

6.00

【相關(guān)知識】

    立體幾何空間概念、平面幾何求距離、兩點(diǎn)間最短距離。

【解題分析】

    這種題目原來上數(shù)學(xué)課的時候做過,不過自己寫一個通用的程序就不怎么簡單了。我當(dāng)時沒怎么想,覺得就用數(shù)學(xué)方法,枚舉各種情況,一一處理就好了(Sherock就是用的這個方法,而且推出了公式,代碼超級牛)。不過我不怎么擅長推公式,而且我比賽的時候推公式是一般會錯的(后來證明我寫代碼也容易錯)。

最后我用的方法非常樸實(shí):對長方體分三種方式(前->->->下,前->->->左,下->->->左)展開,然后在每種展開情況下求平面最短距離(如果兩個點(diǎn)有一個以上不在展開平面內(nèi):對于兩點(diǎn),有兩種連線方式(想象一下,可以從一個點(diǎn)順時針或逆時針到另一個點(diǎn))。

【解題思路】

    我的思路是:分別從三個方向(前->->->下,前->->->左,下->->->左),將長方體展開,如果兩個點(diǎn)都在這些面,分兩種情況求兩點(diǎn)間距離,否則返回一個很大的數(shù)值。所有求得值得最小值就是解(怎么證明?)。

【測試數(shù)據(jù)】

    我個人認(rèn)為這個題必須設(shè)計以下數(shù)據(jù)(特別是對于我的程序的數(shù)據(jù)):

1、兩個點(diǎn)在一個面(六個面六組);

2、兩個點(diǎn)在相鄰面(八組);

3、相對面的兩點(diǎn)(三組);

4、在兩個面相交的地方的點(diǎn)的情況,三個面相交的點(diǎn)的情況(很多組,而且測試數(shù)據(jù)中肯定有不少這樣的數(shù)據(jù))。

【解題總結(jié)】

    當(dāng)時我較快就想出了思路,然后沒寫,去吃午飯得時候我向Felicia他們說了下自己得思路,他們沒聽懂。回來后寫code,代碼非常臃腫,結(jié)果復(fù)制得原因,我有一個函數(shù)忘記改調(diào)一個地方,好在后面通過數(shù)據(jù)找出來了,WA了三次。

 





【程序代碼】

下面是我當(dāng)時的代碼,很臃腫,可以優(yōu)化很多,在這里給大家笑話!!!大家自己寫好點(diǎn)的代碼吧(我過一段時間再貼優(yōu)化代碼)


1 # include <iostream>
  2 # include <cmath>
  3 using namespace std;
  4 
  5 const int MAX = 0x7fffffff;
  6 
  7 int L, W, H;
  8 int xx1, xx2, yy1, yy2, zz1, zz2;
  9 double ans;
 10 
 11 bool in_field_1_2(int xx, int yy, int zz)
 12 {
 13     if ((yy == W || yy == 0&& (zz < H && zz > 0&& (xx > 0 && xx < L)) return true;
 14 //    cout << "not in field 1/2" << endl; ///
 15     return false;
 16 }
 17 
 18 bool in_field_3_4(int xx, int yy, int zz)
 19 {
 20     if ((zz == H || zz == 0&& (xx < L && xx > 0&& (yy > 0 && yy < W)) return true;
 21 //    cout << "not in field 3/4" << endl; ///
 22     return false;
 23 }
 24 
 25 bool in_field_5_6(int xx, int yy, int zz)
 26 {
 27     if ((xx == L || xx == 0&& (zz < H && zz > 0&& (yy > 0 && yy < W)) return true;
 28 //    cout << "not in field 5/6" << endl; ///
 29     return false;
 30 }
 31 
 32 bool in_field_1(int xx, int yy, int zz)
 33 {
 34     if (yy == 0return true;
 35 //    cout << "not in field 1" << endl; ///
 36     return false;
 37 }
 38 
 39 bool in_field_2(int xx, int yy, int zz)
 40 {
 41     if (yy == W) return true;
 42 //    cout << "not in field 2" << endl; ///
 43     return false;
 44 }
 45 
 46 bool in_field_3(int xx, int yy, int zz)
 47 {
 48     if (zz == 0return true;
 49 //    cout << "not in field 3" << endl; ///
 50     return false;
 51 }
 52 
 53 bool in_field_4(int xx, int yy, int zz)
 54 {
 55     if (zz == H) return true;
 56 //    cout << "not in field 4" << endl; ///
 57     return false;
 58 }
 59 bool in_field_5(int xx, int yy, int zz)
 60 {
 61     if (xx == 0return true;
 62 //    cout << "not in field 5" << endl; ///
 63     return false;
 64 }
 65 
 66 bool in_field_6(int xx, int yy, int zz)
 67 {
 68     if (xx == L) return true;
 69 //    cout << "not in field 6" << endl; ///
 70     return false;
 71 }
 72 
 73 double cal_1()
 74 {
 75     if (in_field_5_6(xx1, yy1, zz1)) return MAX;
 76     if (in_field_5_6(xx2, yy2, zz2)) return MAX;
 77 
 78     int xxxx1 = xx1, xxxx2 = xx2, zzzz1, zzzz2;
 79     if (in_field_1(xx1, yy1, zz1))
 80     {
 81         zzzz1 = zz1;
 82     }
 83     else if (in_field_4(xx1, yy1, zz1))
 84     {
 85         zzzz1 = H + yy1;
 86     }
 87     else if (in_field_2(xx1, yy1, zz1))
 88     {
 89         zzzz1 = H+W+(H-zz1);
 90     }
 91     else
 92     {
 93         zzzz1 = H+W+H+(W-yy1);
 94     }
 95     
 96     
 97     if (in_field_1(xx2, yy2, zz2))
 98     {
 99         zzzz2 = zz2;
100     }
101     else if (in_field_4(xx2, yy2, zz2))
102     {
103         zzzz2 = H+yy2;
104     }
105     else if (in_field_2(xx2, yy2, zz2))
106     {
107         zzzz2 = H+W+(H-zz2);
108     }
109     else
110     {
111         zzzz2 = H+W+H+(W-yy2);
112     }
113     
114     int tmp;
115     if (zzzz2 < zzzz1)
116     {
117         tmp = zzzz1;
118         zzzz1 = zzzz2;
119         zzzz2 = tmp;
120     }
121     
122 //    cout << "cal 1-----------" << endl;///
123 //    cout << xxxx1 << " " << zzzz1 << endl;///
124 //    cout << xxxx2 << " " << zzzz2 << endl;///
125     
126     int dis1 = (zzzz2 - zzzz1)*(zzzz2-zzzz1) + (xxxx2 - xxxx1)*(xxxx2-xxxx1);
127     int dis2 = (H+W+H+W+zzzz1 - zzzz2)*(H+W+H+W+zzzz1 - zzzz2) + (xxxx2 - xxxx1)*(xxxx2-xxxx1);
128     
129     if (dis2 < dis1) dis1 = dis2;
130     
131     return sqrt(dis1);
132 }
133 
134 double cal_2()
135 {
136     if (in_field_3_4(xx1, yy1, zz1)) return MAX;
137     if (in_field_3_4(xx2, yy2, zz2)) return MAX;
138 
139     int xxxx1, xxxx2, zzzz1 = zz1, zzzz2 = zz2;
140     if (in_field_1(xx1, yy1, zz1))
141     {
142         xxxx1 = xx1;
143     }
144     else if (in_field_6(xx1, yy1, zz1))
145     {
146         xxxx1 = L + yy1;
147     }
148     else if (in_field_2(xx1, yy1, zz1))
149     {
150         xxxx1 = L + W + (L - xx1);
151     }
152     else
153     {
154         xxxx1 = L+W+L+(W-yy1);
155     }
156 
157 
158     if (in_field_1(xx2, yy2, zz2))
159     {
160         xxxx2 = xx2;
161     }
162     else if (in_field_6(xx2, yy2, zz2))
163     {
164         xxxx2 = L + yy2;
165     }
166     else if (in_field_2(xx2, yy2, zz2)) // WA!!!
167     {
168         xxxx2 = L + W + (L - xx2);
169     }
170     else
171     {
172         xxxx2 = L+W+L+(W-yy2);
173     }
174 
175     int tmp;
176     if (xxxx2 < xxxx1)
177     {
178         tmp = xxxx1;
179         xxxx1 = xxxx2;
180         xxxx2 = tmp;
181     }
182 
183 //    cout << "cal 2-----------" << endl;///
184 //    cout << zzzz1 << " " << xxxx1 << endl;///
185 //    cout << zzzz2 << " " << xxxx2 << endl;///
186 
187     int dis1 = (xxxx2 - xxxx1)*(xxxx2-xxxx1) + (zzzz2 - zzzz1)*(zzzz2-zzzz1);
188     int dis2 = (L+W+L+W+xxxx1 - xxxx2)*(L+W+L+W+xxxx1 - xxxx2) + (zzzz2 - zzzz1)*(zzzz2-zzzz1);
189 
190     if (dis2 < dis1) dis1 = dis2;
191     return sqrt(dis1);
192 }
193 
194 double cal_3()
195 {
196     if (in_field_1_2(xx1, yy1, zz1)) return MAX;
197     if (in_field_1_2(xx2, yy2, zz2)) return MAX;
198 
199     int yyyy1 = yy1, yyyy2 = yy2, xxxx1, xxxx2;
200     if (in_field_3(xx1, yy1, zz1))
201     {
202         xxxx1 = xx1;
203     }
204     else if (in_field_6(xx1, yy1, zz1))
205     {
206         xxxx1 = L + zz1;
207     }
208     else if (in_field_4(xx1, yy1, zz1))
209     {
210         xxxx1 = L+H+(L-xx1);
211     }
212     else
213     {
214         xxxx1 = L+H+L+(H-zz1);
215     }
216 
217 
218     if (in_field_3(xx2, yy2, zz2))
219     {
220         xxxx2 = xx2;
221     }
222     else if (in_field_6(xx2, yy2, zz2))
223     {
224         xxxx2 = L + zz2;
225     }
226     else if (in_field_4(xx2, yy2, zz2))
227     {
228         xxxx2 = L+H+(L-xx2);
229     }
230     else
231     {
232         xxxx2 = L+H+L+(H-zz2);
233     }
234 
235     int tmp;
236     if (xxxx2 < xxxx1)
237     {
238         tmp = xxxx1;
239         xxxx1 = xxxx2;
240         xxxx2 = tmp;
241     }
242 
243 //    cout << "cal 3-----------" << endl;///
244 //    cout << yyyy1 << " " << xxxx1 << endl;///
245 //    cout << yyyy2 << " " << xxxx2 << endl;///
246 
247     int dis1 = (xxxx2 - xxxx1)*(xxxx2-xxxx1) + (yyyy2 - yyyy1)*(yyyy2-yyyy1);
248     int dis2 = (L+H+L+H+xxxx1 - xxxx2)*(L+H+L+H+xxxx1 - xxxx2) + (yyyy2 - yyyy1)*(yyyy2-yyyy1);
249 
250     if (dis2 < dis1) dis1 = dis2;
251     return sqrt(dis1);
252 }
253 
254 int main()
255 {
256     double tmp;
257     while (true)
258     {
259         scanf("%d %d %d"&L, &W, &H);
260         if (L == -1 && W == -1 && H == -1break;
261         ans = MAX;
262         scanf("%d %d %d"&xx1, &yy1, &zz1);
263         scanf("%d %d %d"&xx2, &yy2, &zz2);
264         tmp = cal_1();
265 //        cout << "tmp = " <<  tmp << endl; ///
266         if (tmp < ans) ans = tmp;
267         tmp = cal_2();
268 //        cout << "tmp = " <<  tmp << endl; ///
269         if (tmp < ans) ans = tmp;
270         tmp = cal_3();
271 //        cout << "tmp = " <<  tmp << endl; ///
272         if (tmp < ans) ans = tmp;
273         
274         printf("%.2lf\n", ans);
275     }
276     return 0;
277 }
278 




下面是Sherlock的代碼,思路跟我的差不多,不過他推了公式,然后代碼比我的簡單多了。


 1 /*
 2     已知立方體長寬高分別為L、W、H,給定立方體上兩個點(diǎn)(a, b, c), (x, y, z)(x, a <= L, y, b <= W, z, c <= H)
 3     求該兩點(diǎn)間的最短距離 
 4 */
 5 
 6 #include<iostream>
 7 #include<cmath>
 8 
 9 using namespace std;
10 
11 int                l, w, h, a, b, c, x, y, z;
12 double            ans;
13 
14 double            f(int x)
15 {
16     return ((x + 0.0* (x + 0.0));
17 }
18 
19 void            count1()
20 {
21     ans = sqrt(f(a - x) + f(b - y) + f(c - z) + 0.0);
22 }
23 
24 void            count2()
25 {
26     double        ans1, ans2;
27     if (b == 0 || b == w)
28     {
29         ans1 = sqrt(min(f(h - z + w + h - c), f(z + w + c)) + f(x - a));
30         ans2 = sqrt(min(f(l - x + w + l - a), f(x + w + a)) + f(c - z));
31     }
32     else
33         if (a == 0 || a == l)
34         {
35             ans1 = sqrt(min(f(w - y + l + w - b), f(y + l + b)) + f(c - z));
36             ans2 = sqrt(min(f(h - z + l + h - c), f(z + l + c)) + f(b - y));
37         }
38         else
39         {
40             ans1 = sqrt(min(f(w - y + h + w - b), f(y + h + b)) + f(x - a));
41             ans2 = sqrt(min(f(l - x + h + l - a), f(x + h + a)) + f(b - y));
42         }
43     ans = min(ans1, ans2);
44 }
45 
46 void            count3()
47 {
48     if (a == 0 || a == l)
49     {
50         if (y == 0 || y == w)
51             ans = sqrt((f(abs(x - a) + abs(b - y)) + f(c - z)) + 0.0);
52         else
53             ans = sqrt((f(abs(z - c) + abs(x - a)) + f(b - y)) + 0.0);
54     }
55     else
56         if (b == 0 || b == w)
57         {
58             if (x == 0 || x == l)
59                 ans = sqrt((f(abs(x - a) + abs(b - y)) + f(c - z)) + 0.0);
60             else
61                 ans = sqrt((f(abs(c - z) + abs(b - y)) + f(a - x)) + 0.0);
62         }
63         else
64         {
65             if (x == 0 || x == l)
66                 ans = sqrt((f(abs(c - z) + abs(x - a)) + f(b - y)) + 0.0);
67             else
68                 ans = sqrt((f(abs(c - z) + abs(b - y)) + f(a - x)) + 0.0);
69         }
70 }
71 
72 int                main()
73 {
74     while (scanf("%d%d%d"&l, &w, &h) != -1)
75     {
76         if (l == -1 && w == -1 && h == -1)
77             break;
78         scanf("%d%d%d%d%d%d"&a, &b, &c, &x, &y, &z);
79         if ((a == x && (a == 0 || a == l)) || (b == y && (b == 0 || b == w)) || (c == z && (c == 0 || c == h)))
80             count1();
81         else
82             if ((a == 0 && x == l) || (b == 0 && y == w) || (c == 0 && z == h) || (a == l && x == 0|| (b == w && y == 0|| (c == h && z == 0))
83                 count2();
84             else
85                 count3();
86         printf("%.2lf\n", ans);
87     }
88 }
89 

posted on 2008-01-23 10:03 R2 閱讀(1455) 評論(3)  編輯 收藏 引用 所屬分類: Problem Solving

FeedBack:
# re: 【幾何】昨天我水過去的A題[未登錄]
2008-01-28 10:14 | Felicia
你把Sherlock的名字寫錯啦  回復(fù)  更多評論
  
# re: 【幾何】昨天我水過去的A題
2008-02-13 08:37 | R2@whuacm
@Felicia
嗯,改過來了~~  回復(fù)  更多評論
  
# re: 【幾何】昨天我水過去的A題
2011-06-06 15:45 | Zheng Gao
通用公式推導(dǎo)的不對,有些情況沒考慮到
  回復(fù)  更多評論
  
你是第 free hit counter 位訪客




<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(4)

隨筆分類(54)

隨筆檔案(52)

文章檔案(1)

ACM/ICPC

技術(shù)綜合

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 64246
  • 排名 - 357

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品视频中文字幕| 欧美高清视频一区| 国产视频亚洲| 国产精品乱看| 久久精品一区二区三区中文字幕| 欧美99在线视频观看| 久久免费观看视频| 欧美 日韩 国产 一区| 欧美成人自拍| 欧美午夜免费电影| 国产一区二区主播在线| 激情欧美一区二区三区| 亚洲精品国产日韩| 性色av一区二区三区| 久久手机免费观看| 亚洲大胆女人| 亚洲经典在线看| 日韩一区二区免费高清| 亚洲欧美日韩国产一区| 久久精品国产成人| 欧美精品国产精品| 国产精品丝袜白浆摸在线| 精品成人在线视频| 亚洲线精品一区二区三区八戒| 欧美一区二区三区在线视频 | 亚洲大片免费看| 一本色道久久综合| 久久er精品视频| 欧美久久久久中文字幕| 国产亚洲一区二区三区在线观看| 亚洲精品国精品久久99热| 亚洲欧美国产高清| 欧美jizz19hd性欧美| 亚洲精品美女在线观看| 西西裸体人体做爰大胆久久久 | 国产欧美精品一区| 亚洲精品视频一区| 久久精品国亚洲| 亚洲美女av电影| 浪潮色综合久久天堂| 国产精品白丝av嫩草影院| 亚洲国产日本| 久久先锋资源| 亚洲欧美变态国产另类| 欧美电影美腿模特1979在线看| 国产在线欧美日韩| 小处雏高清一区二区三区| 亚洲人永久免费| 玖玖综合伊人| 在线成人性视频| 欧美在线观看天堂一区二区三区| 亚洲卡通欧美制服中文| 欧美成年人视频网站| 尤物精品在线| 久久精品国产免费| 亚洲欧美制服中文字幕| 欧美日韩另类字幕中文| 亚洲免费在线| 欧美激情一二区| 欧美亚洲三区| 国产老女人精品毛片久久| 一区二区电影免费观看| 亚洲电影免费观看高清完整版在线观看| 性欧美xxxx视频在线观看| 国产片一区二区| 久久久九九九九| 久久精品免费播放| 韩国av一区二区三区| 久久一日本道色综合久久| 久久久久久九九九九| 在线精品在线| 亚洲国产精品久久久久久女王| 久久综合给合久久狠狠狠97色69| 在线观看成人网| 欧美激情导航| 欧美日韩专区在线| 亚洲欧美日韩综合国产aⅴ| 亚洲一区久久| 国产有码在线一区二区视频| 美女露胸一区二区三区| 欧美激情国产精品| 亚洲一区制服诱惑| 欧美在现视频| 亚洲裸体在线观看| 亚洲香蕉在线观看| 一区二区三区在线免费播放| 欧美大片一区二区三区| 欧美精品一区二区三区在线播放 | 91久久在线| 亚洲靠逼com| 国产婷婷色一区二区三区| 裸体一区二区| 欧美黄色免费网站| 欧美一区二区在线| 美日韩精品免费观看视频| 一区二区三区精品视频在线观看| 亚洲综合不卡| 亚洲激情小视频| 亚洲小视频在线观看| 亚洲国产三级在线| 亚洲欧美国产毛片在线| 91久久精品视频| 亚洲小说欧美另类社区| 亚洲啪啪91| 性久久久久久| 一区二区日韩欧美| 久久免费视频网| 午夜精品福利电影| 欧美成人午夜激情| 久久亚洲精品一区| 欧美视频精品一区| 欧美国产丝袜视频| 国产偷自视频区视频一区二区| 亚洲激情视频在线观看| 一区二区在线视频播放| 亚洲欧美精品在线| 99视频一区| 另类天堂av| 久热精品视频在线观看| 在线日本欧美| 欧美日韩在线电影| 亚洲电影在线观看| 含羞草久久爱69一区| 亚洲一区3d动漫同人无遮挡| 亚洲国产一区二区三区a毛片| 小处雏高清一区二区三区| 亚洲欧美日韩国产一区| 欧美精品二区| 亚洲精品影视在线观看| 亚洲国产毛片完整版| 久久精品国产亚洲精品| 欧美一级大片在线观看| 国产精品日韩一区| 亚洲视频在线二区| 亚洲在线一区二区| 欧美网站在线观看| 亚洲精品少妇30p| 一区二区电影免费在线观看| 欧美精品成人91久久久久久久| 亚洲第一精品影视| 亚洲欧洲综合另类在线| 欧美成人一区二区三区在线观看| 狂野欧美一区| 在线观看视频免费一区二区三区| 久久精品国产清高在天天线| 老司机成人网| 亚洲福利av| 欧美成人午夜| 夜夜嗨av色综合久久久综合网| 亚洲网站啪啪| 国产欧美日韩精品丝袜高跟鞋 | 国产日产精品一区二区三区四区的观看方式 | 美女网站久久| 亚洲第一中文字幕| 日韩视频中文字幕| 国产精品麻豆欧美日韩ww| 亚洲欧美中文日韩在线| 久久久久久久综合日本| 亚洲国产精品传媒在线观看 | 性18欧美另类| 伊甸园精品99久久久久久| 麻豆国产精品777777在线| 亚洲欧洲一区二区三区| 亚洲女人天堂av| 国产一区视频观看| 欧美成人一区二免费视频软件| 一二三区精品福利视频| 久久福利精品| 亚洲精品偷拍| 国产农村妇女毛片精品久久麻豆| 久久精品久久99精品久久| 亚洲国产毛片完整版 | 欧美激情亚洲综合一区| 亚洲一区区二区| 在线看片一区| 国产精品麻豆va在线播放| 国内精品美女在线观看| 99re6这里只有精品| 久久精品官网| 精品91视频| 亚洲一级在线观看| 亚洲欧洲精品天堂一级| 亚洲自拍偷拍麻豆| 欧美日韩国产bt| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲欧美一区二区精品久久久| 亚洲精品国产系列| 黄色国产精品| av成人手机在线| 国产精品国产a级| 欧美一区二区三区视频| 久久精品男女| 一区二区毛片| 欧美激情2020午夜免费观看| 欧美成人高清| 国产日韩欧美在线视频观看| 亚洲天堂男人| 午夜视频在线观看一区二区三区 | 亚洲狼人精品一区二区三区| 久久精品五月|