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

oyjpArt ACM/ICPC算法程序設(shè)計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

Robot

Posted on 2007-09-13 10:29 oyjpart 閱讀(1524) 評論(0)  編輯 收藏 引用 所屬分類: ACM/ICPC或其他比賽
好久沒貼題了。
貼個吧。

Robot
Time Limit:1000MS  Memory Limit:65536K
Total Submit:590 Accepted:208

Description

Let (x1, y1), …, (xn, yn) be a collection of n points in a two-dimensional plane. Your goal is to navigate a robot from point (x1, y1) to point (xn, yn). From any point (xi, yi), the robot may travel to any other point (xj, yj) at most R units away at a speed of 1 unit per second. Before it does this, however, the robot must turn until it faces (xj, yj); this turning occurs at a rate of 1 degree per second.

Compute the shortest time needed for the robot to travel from point (x1, y1) to (xn, yn). Assume that the robot initially faces (xn, yn). To prevent floating-point precision issues, you should use the double data type instead of float. It is guaranteed that the unrounded shortest time will be no more than 0.4 away from the closest integer. Also, if you decide to use inverse trigonometric functions in your solution (hint, hint!), try atan2() rather than acos() or asin().

 

Input

The input test file will contain multiple test cases. Each test case will begin with a single line containing an integer R, the maximum distance between points that the robot is allowed to travel (where 10 ≤ R ≤ 1000), and an integer n, the number of points (where 2 ≤ n ≤ 20). The next n lines each contain 2 integer values; here, the ith line contains xi and yi (where −1000 ≤ xi, yi ≤ 1000). Each of the points is guaranteed to be unique. The end-of-file is denoted by a test case with R = n = −1.

 

Output

The output test file should contain a single line per test case indicating the shortest possible time in second (rounded to the nearest integer) required for the robot to travel from (x1, y1) to (xn, yn). If no trip is possible, print “impossible” instead.

 

Sample Input

10 2
0 0
7 0
10 3
0 0
7 0
14 5
10 3
0 0
7 0
14 10
-1 -1

 

Sample Output

7
71
impossible

 

Source
Stanford Local 2006


注意:下面這個代碼是Wrong Answer的代碼:

 1#include <queue>
 2#include <stdio.h>
 3#include <math.h>
 4using namespace std;
 5
 6const int N = 21;
 7const double EPS = 1e-8f;
 8const double INF = 1e100;
 9const double PI = acos(-1.0);
10
11inline int dblcmp(double a, double b) {
12    if(fabs(a-b) < EPS) 
13        return 0;
14    return a < b ? -1 : 1;
15}
16
17int D, n;
18double x[N], y[N];
19double d[N];
20bool chk[N];
21
22struct Node {
23    double a;
24    int id;
25    Node(){} 
26    Node(int ii, double aa) {
27        a = aa; 
28        id = ii;
29    }
30};
31
32bool operator<(const Node& a, const Node& b) {
33    return dblcmp(d[a.id], d[b.id]) == 1;
34}
35
36double cal_dist(double agl, int a, int b, double& old) {
37    old = atan2(y[b]-y[a], x[b]-x[a]);
38    double now = fabs(old-agl);
39    double now2 = 2*PI-fabs(old-agl);
40    if(now2 < nownow = now2;
41    double dist = sqrt( (x[a]-x[b])*(x[a]-x[b]) + (y[a]-y[b])*(y[a]-y[b]) ); 
42    if(dblcmp(dist, D) == 1
43        return INF;
44    return now * 180.0/PI + dist;
45}
46
47void solve() {
48    int i;
49    priority_queue<Node> PQ;
50    memset(chk, 0, sizeof(chk));
51    double a = atan2(y[n-1]-y[0], x[n-1]-x[0]);
52    PQ.push(Node(0, a));
53    d[0= 0;
54    for(i = 1; i < n; ++i)
55        d[i] = INF;
56    while(!PQ.empty()) {
57        double a = PQ.top().a;
58        int id = PQ.top().id;
59        PQ.pop();
60        if(chk[id]) continue;
61        chk[id] = 1;
62        if(id == n-1) {
63            printf("%.0lf\n", d[n-1]);
64            return;
65        }
66        for(i = 0; i < n; ++i) if(!chk[i]) {
67            double nowa;
68            double nowd = cal_dist(a, id, i, nowa);
69            if(dblcmp(nowd+d[id], d[i]) == -1) {
70                d[i] = nowd+d[id];
71                PQ.push(Node(i, nowa));
72            }
73        }
74    }
75
76    printf("impossible\n");
77}
78
79int main() {
80
81    freopen("t.in""r", stdin);
82//    freopen("t.out""w", stdout);
83
84    int i;
85    while(scanf("%d %d"&D, &n), !(D==-1 && n==-1)) {
86        for(i = 0; i < n; ++i)
87            scanf("%lf%lf"&x[i], &y[i]);
88        solve();
89    }
90    return 0;
91}
92


這個代碼哪里錯了呢?
思來想去想到可能是出現(xiàn)了下面這種情況
一個狀態(tài)A進入隊列
過了一會又一個狀態(tài)通過其他路徑到達(dá)A狀態(tài) 并且耗費比前面一次少
這個代碼的做法是直接把其送入PQ,由于修改了d[A], 所以希望這個節(jié)點能夠浮上去(浮到正確的位置)。
但是Wrong Answer。
可能這個節(jié)點在向上浮的過程中遇到了前面這個A狀態(tài) 于是就不往上浮了。但其實前面那個狀態(tài)并沒有修正本身的位置,所以導(dǎo)致了新的狀態(tài)的位置出錯。

所以還是改成了下面的代碼 AC
 1#include <queue>
 2#include <stdio.h>
 3#include <math.h>
 4using namespace std;
 5const int N = 21;
 6const double EPS = 1e-8f;
 7const double INF = 1e100;
 8const double PI = acos(-1.0);
 9inline int dblcmp(double a, double b) {
10 if(fabs(a-b) < EPS) 
11  return 0;
12 return a < b ? -1 : 1;
13}

14int D, n;
15double x[N], y[N];
16double d[N];
17bool chk[N];
18struct Node {
19 double a, dist;
20 int id;
21 Node(){} 
22 Node(int ii, double aa, double dd) {
23  a = aa; id = ii; dist = dd;
24 }

25}
;
26bool operator<(const Node& a, const Node& b) {
27 if(dblcmp(a.dist, b.dist) == 1)
28  return true;
29 return false;
30}

31double cal_dist(double agl, int a, int b, double& old) {
32 old = atan2(y[b]-y[a], x[b]-x[a]);
33 double now = fabs(old-agl);
34 double now2 = 2*PI-fabs(old-agl);
35 if(now2 < now) now = now2;
36 double dist = sqrt( (x[a]-x[b])*(x[a]-x[b]) + (y[a]-y[b])*(y[a]-y[b]) ); 
37 if(dblcmp(dist, D) == 1
38  return INF;
39 return now * 180.0/PI + dist;
40}

41void solve() {
42 int i;
43 priority_queue<Node> PQ;
44 memset(chk, 0sizeof(chk));
45 double a = atan2(y[n-1]-y[0], x[n-1]-x[0]);
46 PQ.push(Node(0, a, 0));
47 d[0= 0;
48 for(i = 1; i < n; ++i)
49  d[i] = INF;
50 while(!PQ.empty()) {
51  double a = PQ.top().a;
52  int id = PQ.top().id;
53  double dist = PQ.top().dist;
54  PQ.pop();
55  if(chk[id]) continue;
56  chk[id] = 1;
57  if(id == n-1{
58   printf("%.0lf\n", d[n-1]);
59   return;
60  }

61  for(i = 0; i < n; ++i) if(!chk[i]) {
62   double nowa;
63   double nowd = cal_dist(a, id, i, nowa);
64   if(dblcmp(nowd+d[id], d[i]) == -1{
65    d[i] = nowd+d[id];
66    PQ.push(Node(i, nowa, nowd+d[id]));
67   }

68  }

69 }

70 printf("impossible\n");
71}

72int main() {
73 freopen("t.in""r", stdin);
74 int i;
75 while(scanf("%d %d"&D, &n), !(D==-1 && n==-1)) {
76  for(i = 0; i < n; ++i)
77   scanf("%lf%lf"&x[i], &y[i]);
78  solve();
79 }

80 return 0;
81}

82
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美1区免费| 午夜精品久久99蜜桃的功能介绍| 国产精品v日韩精品| 老司机成人在线视频| 亚洲免费影视第一页| 亚洲精品综合久久中文字幕| 久久精品一区| 欧美一区成人| 亚洲午夜性刺激影院| 亚洲精品小视频| 在线精品国产成人综合| 国产午夜亚洲精品羞羞网站| 国产精品第2页| 欧美美女日韩| 欧美精品福利视频| 欧美暴力喷水在线| 美女日韩在线中文字幕| 久久久欧美精品sm网站| 欧美一区二区成人| 亚洲欧美中文字幕| 亚洲欧美影院| 亚洲女ⅴideoshd黑人| 在线视频精品| 亚洲视频一区二区| 亚洲一二三区视频在线观看| 一区二区三区久久网| 99国产精品久久久久老师| 亚洲精品午夜精品| 亚洲美女av网站| 日韩午夜高潮| 一本色道久久综合精品竹菊| 日韩视频不卡| 在线一区日本视频| 亚洲欧美成人综合| 欧美一区二区三区免费视| 午夜一区二区三视频在线观看 | 99国产一区| 日韩一级成人av| 一区二区三区精品在线 | 麻豆免费精品视频| 另类亚洲自拍| 欧美精品97| 欧美午夜精品久久久| 国产精品嫩草99a| 国产亚洲激情视频在线| 国产视频精品xxxx| 黄色精品一区| 最新日韩欧美| 制服丝袜亚洲播放| 亚洲欧美一区二区原创| 久久久www| 欧美国产一区二区三区激情无套| 91久久国产综合久久| 亚洲精品一区久久久久久| 一本久久精品一区二区| 亚洲欧美日韩综合| 久久久久久一区二区| 欧美精品国产一区| 国产精品一区二区a| 伊人久久亚洲美女图片| 亚洲欧洲在线免费| 亚洲在线观看免费| 久久在线视频| 亚洲免费观看| 久久av一区二区| 欧美国产日本| 国产欧美日本在线| 亚洲日本aⅴ片在线观看香蕉| 亚洲一区区二区| 乱码第一页成人| 99精品国产在热久久婷婷| 欧美一区二区精美| 欧美激情综合在线| 国产亚洲欧美日韩一区二区| 亚洲开发第一视频在线播放| 欧美在线免费观看视频| 亚洲国产成人不卡| 亚洲免费在线观看| 欧美高清免费| 国产一区美女| 亚洲伊人久久综合| 欧美激情按摩| 午夜亚洲性色福利视频| 欧美精品日韩精品| 国产一区在线播放| 亚洲在线一区二区| 亚洲高清不卡在线观看| 性做久久久久久免费观看欧美| 欧美国产日韩精品| 国产综合网站| 亚洲综合精品| 亚洲国产成人久久综合一区| 西瓜成人精品人成网站| 欧美日韩和欧美的一区二区| 狠狠色伊人亚洲综合网站色| 亚洲综合欧美| 亚洲黄网站黄| 久久久久久噜噜噜久久久精品| 国产精品国产馆在线真实露脸| 亚洲国产综合在线看不卡| 欧美一进一出视频| 99精品热视频| 欧美电影在线播放| 亚洲二区免费| 久久视频精品在线| 亚洲欧美日韩天堂| 国产精品国色综合久久| 正在播放亚洲| 亚洲国产欧美日韩| 久久综合九色综合欧美就去吻| 国产一区二区精品久久91| 亚洲女女做受ⅹxx高潮| 日韩天堂在线视频| 欧美日韩国产欧| 亚洲看片一区| 亚洲丁香婷深爱综合| 久久综合电影| 在线观看国产精品淫| 久久全球大尺度高清视频| 欧美伊人影院| 国产亚洲精品激情久久| 欧美在线免费观看| 午夜精品久久久久久久99樱桃| 国产精品女主播一区二区三区| 亚洲综合999| 亚洲图片欧洲图片av| 国产精品成人va在线观看| 亚洲深夜av| 中文精品视频一区二区在线观看| 欧美日韩麻豆| 亚洲一区二区免费看| 亚洲无玛一区| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲一区二区在线免费观看| 日韩一区二区精品葵司在线| 欧美日韩一区二区三区四区五区 | 久久久精品日韩欧美| 午夜精品亚洲一区二区三区嫩草| 国产伦精品一区二区三区免费| 欧美一区国产一区| 欧美在线观看视频一区二区三区| 国产一区视频在线看| 欧美 日韩 国产 一区| 欧美丰满少妇xxxbbb| 在线一区二区三区做爰视频网站 | 两个人的视频www国产精品| 亚洲电影激情视频网站| 亚洲福利免费| 欧美肉体xxxx裸体137大胆| 亚洲欧洲99久久| 欧美在线影院在线视频| 亚洲国产一二三| 一本一本久久a久久精品牛牛影视| 国产精品婷婷午夜在线观看| 久久久免费精品视频| 久热国产精品视频| 日韩亚洲视频| 亚洲女爱视频在线| 在线观看视频免费一区二区三区| 亚洲国产欧美日韩精品| 国产精品v片在线观看不卡| 久久精品视频在线观看| 蜜臀va亚洲va欧美va天堂| 中日韩美女免费视频网址在线观看| 亚洲午夜在线观看视频在线| 黄色国产精品一区二区三区| 亚洲精品小视频在线观看| 国产精品综合av一区二区国产馆| 玖玖玖国产精品| 欧美日韩在线观看一区二区三区| 久久狠狠亚洲综合| 欧美成人一区二区| 性做久久久久久久免费看| 久久亚洲色图| 午夜精品成人在线| 蘑菇福利视频一区播放| 欧美亚洲综合网| 欧美成人国产| 久久久久久久精| 欧美日韩一级视频| 欧美本精品男人aⅴ天堂| 国产精品国产三级国产| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美日韩国产二区| 免费观看国产成人| 国产精品国产三级国产aⅴ入口| 欧美成人免费观看| 国产欧美在线观看| 日韩小视频在线观看| 亚洲高清激情| 香蕉成人伊视频在线观看| 一本久久综合亚洲鲁鲁| 久久久久一区二区三区四区| 亚洲免费一在线| 欧美精品一区二区三区久久久竹菊| 久久久精彩视频| 国产精品三上| 一区二区三区导航| 亚洲品质自拍| 久久在线精品|