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

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>
            久久综合电影| 亚洲欧美视频一区| 久久久久国产一区二区三区四区| 亚洲第一狼人社区| 午夜精品福利在线观看| 欧美色综合天天久久综合精品| 韩国av一区二区三区四区| 一区二区三区高清视频在线观看| 免费欧美在线| 免费av成人在线| 亚洲精品色婷婷福利天堂| 欧美激情aⅴ一区二区三区| 久久在线播放| **网站欧美大片在线观看| 免费成人你懂的| 欧美中文在线视频| 狠狠色丁香婷婷综合影院| 性做久久久久久免费观看欧美| 亚洲淫片在线视频| 国内精品久久久久影院色| 久久久噜噜噜久久人人看| 欧美中文字幕精品| 亚洲国产一区二区三区在线播 | 午夜亚洲精品| 国产一区二区精品丝袜| 久久一区二区三区国产精品 | 久久婷婷国产综合国色天香| 亚洲专区国产精品| 国产亚洲欧美日韩日本| 久久综合九色欧美综合狠狠| 免费看的黄色欧美网站| 一二三四社区欧美黄| 中文成人激情娱乐网| 国产自产精品| 亚洲国产精品嫩草影院| 欧美日韩视频在线| 欧美一区二区三区免费观看视频 | 午夜精品99久久免费| 亚洲国产高清aⅴ视频| 欧美韩日一区二区三区| 欧美日韩视频一区二区三区| 欧美一区永久视频免费观看| 亚洲在线一区二区三区| 又紧又大又爽精品一区二区| 亚洲精品在线一区二区| 国产性色一区二区| 久热精品视频| 欧美插天视频在线播放| 午夜精品久久久久久久久久久久久| 久久精品国产亚洲精品| 在线亚洲+欧美+日本专区| 久久国产精品久久久久久| 亚洲成人在线视频播放| 欧美14一18处毛片| 国产精品v欧美精品v日韩| 米奇777在线欧美播放| 欧美视频一区在线| 欧美国产日韩在线| 国产日韩欧美精品一区| 日韩一级不卡| 亚洲国产三级网| 亚洲影院一区| 尤物精品国产第一福利三区 | 国产精品久久999| 亚洲成人中文| 国一区二区在线观看| 中日韩在线视频| 亚洲区一区二| 美国十次了思思久久精品导航| 欧美一区二区免费视频| 欧美精品一区三区在线观看| 美女脱光内衣内裤视频久久网站| 国产精品免费区二区三区观看| 亚洲高清色综合| 亚洲第一精品夜夜躁人人躁| 亚洲亚洲精品在线观看 | 亚洲一区二区精品视频| 一本色道久久88综合亚洲精品ⅰ| 久久精品免费播放| 久久精品视频在线免费观看| 国产精品久久久久久久7电影| 亚洲破处大片| 国产在线不卡| 午夜亚洲性色福利视频| 久久er99精品| 国产日韩欧美制服另类| 亚洲桃花岛网站| 亚洲欧美乱综合| 国产精品色在线| 99国产精品久久久久老师| 最新中文字幕一区二区三区| 久久综合电影一区| 欧美国产日韩二区| 国产偷国产偷亚洲高清97cao| 一片黄亚洲嫩模| 亚洲永久视频| 国产精品试看| 亚洲综合大片69999| 欧美一区2区视频在线观看| 欧美激情视频在线播放| 亚洲精品你懂的| 亚洲人成亚洲人成在线观看图片| 欧美成年人视频网站欧美| 亚洲国产日韩在线| 亚洲一区二区三区欧美| 欧美日韩a区| 亚洲一区二区视频在线观看| 久久国产日本精品| 亚洲国产视频一区| 欧美视频久久| 欧美在线亚洲在线| 欧美国产日韩视频| 亚洲片在线观看| 欧美福利视频| 亚洲免费一在线| 欧美寡妇偷汉性猛交| 夜夜嗨av一区二区三区免费区| 国产精品捆绑调教| 久久人人97超碰国产公开结果| 亚洲国产毛片完整版| aa日韩免费精品视频一| 国产午夜精品视频| 欧美激情一区二区三区四区| 亚洲一区国产精品| 亚洲第一色中文字幕| 欧美一区二区三区精品| 亚洲国产一区二区精品专区| 欧美高清在线视频| 欧美一区二区观看视频| 亚洲精品国产视频| 久久亚洲影音av资源网| 亚洲一区二区在| 最近看过的日韩成人| 欧美日韩在线视频观看| 午夜精品久久久久久99热软件| 欧美黑人多人双交| 久久综合九色综合欧美就去吻 | 亚洲国产精品精华液网站| 国产日韩综合| 国产亚洲欧美日韩日本| 国产精品人成在线观看免费| 欧美视频网址| 国产精品黄页免费高清在线观看| 欧美人与禽猛交乱配| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产区在线观看成人精品| 国产精品免费一区二区三区在线观看 | 欧美高清日韩| 欧美精品二区| 欧美日韩另类一区| 国产精品久久一卡二卡| 欧美亚州韩日在线看免费版国语版| 欧美日韩国产色站一区二区三区| 欧美激情第10页| 欧美日韩亚洲一区二区| 欧美色网一区二区| 国产精品乱码| 国产亚洲综合在线| 伊人影院久久| 日韩一级精品| 午夜亚洲影视| 久久综合久久综合久久综合| 免费成人激情视频| 亚洲精品乱码久久久久久黑人| 日韩午夜一区| 小黄鸭精品aⅴ导航网站入口| 欧美一区观看| 欧美成人免费观看| 国产精品国产馆在线真实露脸| 国产欧美日韩精品a在线观看| 红桃视频成人| 夜夜嗨av一区二区三区| 欧美一区二区在线免费观看 | 亚洲欧美成人精品| 久久久久国产一区二区三区| 欧美激情一区二区三区蜜桃视频 | 免费在线成人| 欧美亚男人的天堂| 精品动漫av| 一区二区三区四区五区视频 | 欧美高清在线播放| 亚洲一区二区三区视频| 麻豆精品一区二区综合av| 欧美日韩国产三区| 精久久久久久久久久久| 亚洲视频图片小说| 久久综合网络一区二区| 国产精品免费视频xxxx| 亚洲人www| 久久精品电影| 一道本一区二区| 免费成人你懂的| 国产欧美一区二区精品性| 亚洲精品偷拍| 久久久久中文| 亚洲影视在线播放| 欧美精品午夜视频| 亚洲韩国青草视频| 久久午夜av| 亚洲自拍偷拍麻豆|