質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1233閲覧

キューがうまくはたらきません

Magolors

総合スコア21

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/17 15:20

編集2020/02/17 18:07

前提・実現したいこと

コッホ曲線(フラクタル図形を求める問題)をキューを用いて解こうとしているのですが、n=2以降うまく働かず困っております。どなたか解決策を教えていただきたいです。

該当のソースコード

C++

1#include <iostream> 2#include <queue> 3#include <vector> 4#include <algorithm> 5#include <cmath> 6#include <iomanip> 7 8using namespace std; 9 10queue<pair<long double, long double> > p; 11const long double h = sqrt(3)/2.0; 12 13void fractale(){ 14 pair<long double, long double> l, r, temp; 15 do { 16 l = p.front(); p.pop(); 17 r = p.front(); p.pop(); 18 long double theta = atan2(r.second-l.second, r.first-l.first); 19 long double leng = sqrt((r.second-l.second)*(r.second-l.second)+(r.first-l.first)*(r.first-l.first)); 20 p.push(l); 21 temp = make_pair(l.first+(r.first-l.first)/3.0, l.second+(r.second-l.second)/3.0); 22 p.push(temp); 23 p.push(temp); 24 temp = make_pair(l.first+(r.first-l.first)/2.0+leng*h*sin(theta)/3.0, l.second+(r.second-l.second)/2.0+leng*h*cos(theta)/3.0); 25 p.push(temp); 26 p.push(temp); 27 temp = make_pair(l.first+2*(r.first-l.first)/3.0, l.second+2*(r.second-l.second)/3.0); 28 p.push(temp); 29 p.push(temp); 30 p.push(r); 31 } while (r.first != 100); 32} 33 34int main(){ 35 int n; 36 cin >> n; 37 pair<long double, long double> temp = make_pair(0.0, 0.0); 38 p.push(temp); 39 temp = make_pair(100.0, 0.0); 40 p.push(temp); 41 for (int i = 0; i < n; i++){ 42 fractale(); 43 } 44 cout << fixed << setprecision(10); 45 cout << p.front().first << " " << p.front().second << endl; 46 p.pop(); 47 do { 48 cout << p.front().first << " " << p.front().second << endl; 49 p.pop(); p.pop(); 50 } while (p.front().first != 100); 51 cout << p.front().first << " " << p.front().second << endl; 52}

試したこと

回答ありがとうございます。ご指摘の内容をもとに改善したのですが、今度は動作しないようになってしまいました。n>=1の入力を仮定しているので、pop()の部分は問題ないと思うのですが、なぜ動かないかわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/02/17 15:26

うまく働かないとはどういう動作をするんでしょうか
Magolors

2020/02/17 15:28

n=2で 66.6666666667 0.0000000000 50.0000000000 -28.8675134595 33.3333333333 0.0000000000 0.0000000000 0.0000000000 11.1111111111 0.0000000000 12.9629629630 3.2075014955 16.6666666667 6.4150029910 14.8148148148 6.4150029910 16.6666666667 9.6225044865 22.2222222222 0.0000000000 25.9259259259 0.0000000000 27.7777777778 3.2075014955 29.6296296296 0.0000000000 33.3333333333 0.0000000000 50.0000000000 28.8675134595 51.8518518519 25.6600119640 50.0000000000 25.6600119640 53.7037037037 22.4525104685 55.5555555556 19.2450089730 50.0000000000 19.2450089730 53.7037037037 16.0375074775 52.7777777778 17.6412582252 57.4074074074 12.8300059820 61.1111111111 9.6225044865 66.6666666667 0.0000000000 77.7777777778 0.0000000000 83.3333333333 9.6225044865 88.8888888889 0.0000000000 100.0000000000 0.0000000000 と異なる解を示してしまいます。
y_waiwai

2020/02/17 15:32

うまく働いた場合はどういう解を示すんでしょう。 それらを、質問文を編集して、質問に追記しましょう
Magolors

2020/02/17 15:39

すみませんでした。追加いたしました。
guest

回答2

0

C++

1 l = p.front(); p.pop();//辺の左端 2 r = p.front(); p.pop();//辺の右端

ここで右端もpopしてますが、右端の点は次の左端となるべき点です。
ここで取り出してはいけません。

投稿2020/02/17 17:23

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ざっくり見た感じですが, fractale の do-while 内では始点終点の2つを"直線"として取り出しているのですから, 計算の結果は4本の"直線"の各始点終点である計8つの点を入れないといけないのではないでしょうか.

編集1

表示が面倒になってしまうようですので, yudedako67 さんの回答のようにキューに各座標を1つだけ入れる形で再帰のコードにしてみました.
c++ は大分前に勉強したのみですのでコードの質はご容赦ください.
一応 paiza.io で実行は確認しましたが, 表示される値が一部変なので, 計算式に問題はあるかと思います.

編集2

テスト用にコードを修正しました.

c++

1#include <iostream> 2#include <queue> 3#include <cmath> 4#include <iomanip> 5#include <bits/stdc++.h> 6 7using namespace std; 8 9const long double H = sqrt(3)/2.0; 10 11void fractal(queue<pair<double, double>>& q, int n) { 12 if(n <= 0) return; 13 14 pair<double, double> l, r, t; 15 int size = q.size(); 16 for(int i=0; i<size-1; i++) { 17 l = q.front(); q.pop(); 18 r = q.front(); 19 20 double w = r.first - l.first; 21 double h = r.second - l.second; 22 double theta = atan2(h, w); 23 double length = sqrt(h*h + w*w); 24 25 q.push(l); 26 t = make_pair(l.first+w/3.0, l.second+h/3.0); 27 q.push(t); 28 t = make_pair(l.first+w/2.0+length*H*sin(theta)/3.0, l.second+h/2.0+length*H*cos(theta)/3.0); //orig 29 //t = make_pair(t.first+length*cos(theta+M_PI/3.0)/3.0, t.second+length*sin(theta+M_PI/3.0)/3.0); 30 q.push(t); 31 t = make_pair(l.first+2*w/3.0, l.second+2*h/3.0); 32 q.push(t); 33 } 34 r = q.front(); q.pop(); 35 q.push(r); 36 37 fractal(q, --n); 38} 39void test(int n, const char* ex) { 40 cout << "test: n=" << n << endl; 41 42 queue<pair<double, double>> q; 43 q.push(make_pair(0.0, 0.0)); 44 q.push(make_pair(100.0, 0.0)); 45 46 fractal(q, n); 47 48 ostringstream oss; 49 oss << fixed << setprecision(8); 50 for (; !q.empty(); q.pop()){ 51 oss << q.front().first << " " << q.front().second << "\n"; 52 } 53 54 if(string(ex).compare(oss.str()) == 0) { 55 cout << "=== OK ===" << endl; 56 } else { 57 cout << "*** NG ***" << endl; 58 cout << oss.str() << flush; 59 } 60} 61int main(){ 62 test(1, 63 "0.00000000 0.00000000\n" 64 "33.33333333 0.00000000\n" 65 "50.00000000 28.86751346\n" 66 "66.66666667 0.00000000\n" 67 "100.00000000 0.00000000\n"); 68 69 test(2, 70 "0.00000000 0.00000000\n" 71 "11.11111111 0.00000000\n" 72 "16.66666667 9.62250449\n" 73 "22.22222222 0.00000000\n" 74 "33.33333333 0.00000000\n" 75 "38.88888889 9.62250449\n" 76 "33.33333333 19.24500897\n" 77 "44.44444444 19.24500897\n" 78 "50.00000000 28.86751346\n" 79 "55.55555556 19.24500897\n" 80 "66.66666667 19.24500897\n" 81 "61.11111111 9.62250449\n" 82 "66.66666667 0.00000000\n" 83 "77.77777778 0.00000000\n" 84 "83.33333333 9.62250449\n" 85 "88.88888889 0.00000000\n" 86 "100.00000000 0.00000000\n"); 87}

投稿2020/02/17 17:18

編集2020/02/19 03:48
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問