2次元平面上の2点間の最大距離を求めるプログラム

このQ&Aのポイント
  • 平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み,すべての点の間の距離を計算し,その距離が最大になる点の組(2つの点の座標.最初に入力した点の座標を最初),及び,その距離を出力するプログラムを書け.
  • 入力された平面上の点の座標から距離が最大になる2点を求め、その距離を出力するプログラムを作成する方法を教えてください。
  • 2次元平面上にある複数の点の座標が与えられた場合、その中で距離が最大になる2点を見つけ、その距離を計算するプログラムを作成したいです。どのような方法を用いれば良いでしょうか?
回答を見る
  • ベストアンサー

どこを変えればいいですか?

2次元平面上の2点間の距離 [問題]平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み,すべての点の間の距離を計算し,その距離が最大になる点の組(2つの点の座標.最初に入力した点の座標を最初),及び,その距離を出力するプログラムを書け. (入力例) コメントの部分は除く 3   // 点の数 0 10   // 1 番目の点の x 及び y 座標 0 0   // 2 番目の点の x 及び y 座標 20 0   // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 0 10   // 1 番目の点の x 及び y 座標 20 0   // 3 番目の点の x 及び y 座標 22.36・・・   // 2点間の距離 #include <iostream> #include <math.h> int main() { double max = 0.0, x[100], x1, y[100], y1, r; int i1, i2, n, m1, m2; // 点の数 std::cin >> n; // 点の座標の入力 for (i1 = 0; i1 < n; i1++) std::cin >> x[i1] >> y[i1]; // 点間の距離の計算 for (i1 = 0; i1 < n-1; i1++) { for (i2 = i1+1; i2 < n; i2++) { x1 = x[i1] - x[i2]; y1 = y[i1] - y[i2]; r = sqrt(x1 * x1 + y1 * y1); if (r > max) { max = r; m1 = i1; m2 = i2; } } } // 出力 std::cout << x[m1] << " " << y[m1] << std::endl; std::cout << x[m2] << " " << y[m2] << std::endl; std::cout << max << std::endl; return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

しいていえば、意識、かなぁ。

その他の回答 (1)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.2

http://c.oshiete.goo.ne.jp/oshiete_category.php3?c=250 に「質問の内容が分かりやすいタイトルを書いてください」とあります 質問文のタイトルを変えてください。

関連するQ&A

  • どこを変えればいいか教えてください。

    2次元平面上の点と原点との距離 [問題]平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み,原点 (0, 0) からの平均距離を計算した後,平均距離,原点からの距離が(平均距離-4)以上で,かつ,(平均距離+18)以下であるすべての点の座標,及び,その数を出力するプログラムを書け(座標は,入力された順に出力). (入力例) コメントの部分は除く 3 // 点の数 10 20 // 1 番目の点の x 及び y 座標 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 31.49・・・ // 平均距離 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 2 // 点の数 #include <iostream> #include <math.h> int main() { double mean = 0.0, x[100], y[100], r[100]; int i1, k = 0, n; // _ ̐ std::cin >> n; // _ ̍ W ̓ ͂ƕ ϋ ̌v Z for (i1 = 0; i1 < n; i1++) { std::cin >> x[i1] >> y[i1]; r[i1] = sqrt(x[i1] * x[i1] + y[i1] * y[i1]); mean += r[i1]; } mean /= n; // i ϋ {10 j ȏ㗣 ꂽ _ ̏o std::cout << mean << std::endl; for (i1 = 0; i1 < n; i1++) { if (r[i1] >= mean+10.0) { std::cout << x[i1] << " " << y[i1] << std::endl; k++; } } std::cout << k << std::endl; return 0; }

  • Yesならこっちへ、NOならあっちへ(c++)

    取り組んでる課題で、Yとタイプしたら1のステップにいけて、Nとタイプしたら2のステップに行くというところでわからなくなってしまいました。Userにそういう選択させるのには何をどう書いたらいいのですか? --------------------------------------------------------------------- 問題:1から100までの整数をUserに選ばせ、Userに、「選んだ数字はXX以上ですか?」と質問を繰り返し、最後にUserの選んだ数字を当てるという課題です。(Userはそれに対してYes/Noでしか答えられません。) --------------------------------------------------------------------- int max=100; int min=0; int mid, x; int systemtype=y, sytemtype=n; main(){ while(1){ cout<<"1から100までで好きな数字を選んでね。"; cin>> x; if (n<=0 || n>=100){ break; } if (mid == (max + min)/2){ cout<<"選んだ数字は :" << mid << " より大きい? "<< endl; cout<<" y は YES, n は NO :" << endl; } else if(min == max){ cout<<"その数字は" << x <<endl; break; } else if(min == mid){ mid += ( max - mid)/2; cout<<"あなたの選んだ数は :" << mid <<" より大きい? "<<endl; } else if(max == mid){ mid -= (mid - min)/2; cout<<"あなたの選んだ数は:" << mid << " より大きい? "<< endl; } else cout<<"その数字は :"<< n <<endl; } return 0; }

  • C++

    今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?

  • うまく実行ができない(相関図)

    C++で二次元配列を勉強しています。そこで二次元配列を使用して相関図をつくるプログラムの問題をやっているのですが、自分なりにプログラムをつくったところ、コンパイルはできるのですが実行すると無限ループがおこり、うまく実行できません。いくら考えてもなにがいけないのかわからないので質問させていただきました。 下のは読み込むデータファイル例とその実行例です http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5254.txt 以下はつくってみた間違いプログラムです #include<iostream> #include<string> #include<iomanip> #include<fstream> using namespace std; int main() { int data; string filename,Madata,Endata; int i=0,j=0,x=0,y=0,m=0,n=0,num=100; char* graph[21][21]; ifstream fin; cout << "This program's spec:"<< endl; cout << "point range=(0-100) div=5 leftspace=4 divspace=3" << endl; cout << "Input data File Name!:"; cin >> filename; fin.open(filename.c_str()); if(!fin) { cerr << "指定されたファイルを開けません" << endl; return 1; } while(fin >> data) { Madata[i]=data; fin >> data; Endata[i]=data; i++; } for(m=0; m<21; m++) { for(n=0; n<21; n++) { graph[m][n]=" "; } } for(m=0; m<i; m++) { x=Madata[m]/5; y=Endata[m]/5; graph[x][y]="*"; } for(x=0; x<21; x++) { cout << setw(3) << num << "|"; for(y=0; y<21; y++) { cout << setw(3) << graph[x][y]; } cout << endl; num=num-5; } cout << "----------------------------------------------------------------------" << endl; cout << setw(3) << "|"; for(num=0; num<=100; num+5) { cout << setw(3) << num; } cout << endl; return 0; } 上記のプログラムだと0の無限ループになります。 長々となりましたが、時間のある方教えてください、よろしくおねがいします

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • C++で乱数を重複しないように発生させる

    C++で乱数を重複しないように発生させるようにプログラムを変更しろと言われたのですが、できません。 教えていただきたいです。 #include<iostream> #include<cstdlib> #include<cstring> #include<ctime> using namespace std; int main() { int i,n; int *p; cout<<"何個記憶しますか?"<<endl; cin>>n; p=new int[n]; if(p==NULL){ cout<<"記憶域の確保に失敗しました。"<<endl; return 1; } srand((unsigned)time(NULL)); rand(); i=0; while(i<n){ p[i]=1+(int)((double)rand()/(RAND_MAX+1.0)*75); if(p[i]==p[i]) cout<<"p["<<i<<"]の値"<<p[i]<<endl; i++; } delete[] p; return 0; }

  • 設定した値が意図せぬ値に

    POJ 3176の問題です。 http://poj.org/problem?id=3176 #include <iostream> #include <algorithm> #define MAX 100 using namespace std; int main() { int n; cin >> n; int line[n-1][MAX]; int num[n-1][MAX]; cin >> line[0][0]; if(n==0) { cout << 0 <<endl; return 0; } else if(n==1) { cout << line[0][0] << endl; return 0; } for (int i =1;i < n;i++) { for (int j=0;j < i+1;j++) { int x; cin >> x; line[i][j]= x; } } for (int k= 0 ; k<n;k++) { num[n-1][k]= line [n-1][k]; } for (int k= n-2; k > 0 ; k--) { for (int l=0 ; l<k+1; l++) { num[k][l] = max (num[k+1][l],num[k+1][l+1]) + line[k][l]; } } num[0][0] = max(num[1][0],num[1][1]) + line[0][0]; cout << line[0][0] <<" "<<num[0][0]<<endl; return 0; } 入力 4 3 1 3 1 2 3 1 3 4 5 出力 1 12 最後に出力でline[0][0]をするようにしているのはバグチェックのためです。 ここで僕がわからないのはどうしてline[0][0]が3で宣言し、ほかでいじっていないにも関わらず、最後に1になっているのかということです。 どなたかわかる方がいらっしゃったらよろしくお願いします。

  • C++について。

    現在”猫でもわかるプログラミング”のC++編をSDKと共に勉強している身です。 現在第22章、第23章を勉強中です。 22章 http://www.kumei.ne.jp/c_lang/cpp/cpp_22.htm 23章 http://www.kumei.ne.jp/c_lang/cpp/cpp_23.htm 作業環境はVisual Studio 2005.net C++です 22章でのプログラムを作成し、実行した結果エラーが出てしまいました。 ソースです #include <iostream> class xy_position { int x; int y; public: xy_position(int x = 0, int y = 0){ xy_position::x = x; xy_position::y = y; } int X() const {return x;} int Y() const {return y;} }; ostream& operator << (ostream& o, const xy_position& p) { return o << "(" << p.X() << "," << p.Y() << ")"; } int main(void) { xy_position a(50, 60), b; std::cout << a << b << std::endl; return 0; } (17):error C2143: 構文エラー : ';' が '&' の前にありません。 (17):error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません (17):error C2065: 'o' : 定義されていない識別子です。 (17):error C2059: 構文エラー : 'const' (18):error C2143: 構文エラー : ';' が '{' の前にありません。 (18):error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) (26):error C2679: 二項演算子 '<<' : 型 'xy_position' の右オペランドを扱う演算子が見つかりません (または変換できません)。 このようなエラーが出てしまいました。 もちろんソースは全て同様に書いています。 この”猫でも”で使用しているコンパイラと異なるために出たエラーでしょうか? それに単に cout << のように記述するとエラーが出てしまい、 std::cout << のように記述しなければ通りません。 また、エラーとは別の質問になってしまいますが、プログラム中に int X() const {return x;} という記述がありますが、このconstの意味が分かりません。 単純に return x が変更不可能という意味でしょうか? 次に23章についての質問です。 ここでもソースは同じなのに以下のようなエラーが出てしまいます。 ソースです。 #include <iostream> int main(void) { int x=10, y=15, z=20; std::cout << "16進表示" << std::endl; std::cout.setf(ios::hex); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; std::cout.unsetf(iostream::hex); std::cout << "8進数" << std::endl; std::cout.setf(ios::oct); std::cout << x << std::endl; std::cout << y << std::endl; std::cout << z << std::endl; return 0; } (8):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (8):error C2065: 'hex' : 定義されていない識別子です。 (13):error C2653: 'iostream' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2653: 'ios' : 識別子がクラス名でも名前空間名でもありません。 (15):error C2065: 'oct' : 定義されていない識別子です。 これも何か設定をしなければいけないのでしょうか? なにぶんC++は・・・というかオブジェクト指向の言語は初心者なもので疑問も多いですorz

  • どこを変えたらいいか教えて下さい。

    余りによる数字の分類 [問題]複数の正の整数値を入力し( 0 で入力を終了し,その 0 はデータ数に含めない),41 で割り切れる数の個数,41で割ると 1 余る数の個数,・・・,及び,41 で割ると 40 余る数の個数とそれらの全体の個数に対する割合(%で表示し,小数点以下は切り捨て)を出力するプログラムを書け.出力データは,上で述べた順番で,個数と割合をペアーにし,以下に示すような形式で出力すること(コメントの部分は含まない) 15 2 // 10 で割れる数の個数と全体に対する割合 10 25 // 10 で割ると 1 余る数の個数と全体に対する割合 ・・・ #include <iostream> int main() { int i1, data, k, n = 0, x[10] = {0}, y[10]; // データの入力 std::cin >> data; while (data > 0) { k = data % 10; x[k]++; n++; std::cin >> data; } // 割合の計算 for (i1 = 0; i1 < 10; i1++) y[i1] = 100 * x[i1] / n; // 出力 for (i1 = 0; i1 < 10; i1++) std::cout << x[i1] << " " << y[i1] << std::endl; return 0; }

  • インライン関数の使い道と理屈

    #include <iostream> using namespace std; //max関数の定義 inline int max(int x, int y){if(x>y) return x; else return y;} int main(){ int num1, num2, ans; cout << "1番目の整数を入力して下さい。\n"; cin >> num1; cout <<"2番目の整数を入力して下さい。\n"; cin >> num2; ans = max(num1, num2); cout << "最大値は" << ans << "です。\n"; return 0; } インライン関数の処理は呼び出し部分に埋め込まれるので、プログラムの処理速度が 向上することがありますとあるんですが、 どのような時にインライン関数は使用するのでしょうか? 理由もしくみもご教示お願いします。