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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

475閲覧

多次元配列(高さ、奥行、幅)の奥行を正面とした場合の考え方

kinako_make

総合スコア7

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/09 07:45

編集2020/10/09 08:27

前提・実現したいこと

多次元配列に#と.が格納されています。
その#が格納されているところだけを、奥行を正面としたら#がどういう風に見えるのかという課題です。

イメージ説明説明](fb7da5c206667929f916e5d7fb2f158c.jpeg)

多次元配列[3][3][3] (高さz,奥行x,幅y)
上面から見た#の位置を保存する配列[3][3] (奥行x,幅y)

奥行を正面に見るということで、多次元配列の高さごとに配列の要素を見ていき#があれば
正面用の配列の、同じ位置に#を代入していけばいいと考えました。

しかし、提出したら結果
・違う結果
・ランタイムエラー
になるそうでやり直しになりました。

どんな数値でテストしたのかは教えてもらえず、考え方が間違っているのか、コードが間違っているのか
アドバイスをいただきたいです。

import

1 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 7 int pointX = sc.nextInt(); //立体の奥行き 8 int pointY = sc.nextInt(); //立体の横幅 9 int pointZ = sc.nextInt(); //立体の高さ 10 final int sum = (pointX * pointY); //2次元配列の全ての要素数 11 sc.nextLine(); //改行捨てる 12 char[][][] data = new char[pointZ][pointX][pointY]; //高さ、奥行、幅 13 char[][] ans = new char[pointX][pointY]; //結果用(奥行、幅) 14 15 //.初期化 16 for (int j = 0; j < pointX; j++){ 17 for (int k = 0; k < pointY; k++){ 18 ans[j][k] = '.'; 19 } 20 } 21 22 //情報を読込 23 24 for (int i = 0; i < pointZ; i++){ 25 for (int j = 0; j < pointX; j++){ 26 String str = sc.nextLine(); 27 for (int k = 0; k < pointY; k++){ 28 data[i][j][k] = str.charAt(k); 29 } 30 } 31 sc.nextLine(); //区切り記号 "--" 捨てる 32 } 33 34 int cnt = 0; //カウントを初期化 35 // System.out.println("cnt= " + cnt + " l= " + (pointX - 1)); 36 37 38 for(int l = (pointX - 1); l >= 0; l--){ 39 for (int i = 0; i < pointZ; i++){ 40 for (int k = 0; k < pointY; k++){ 41 // System.out.print(data[i][j][k]); 42 //#の場合、対応する結果用の配列にも#を代入する 43 if(data[i][l][k] == '#'){ 44 ans[i][k] = '#'; 45 // cnt++; 46 } 47 // System.out.print(i + "" + k + " "); 48 } 49 // System.out.println(); 50 } 51 // System.out.println("-------"); 52 } 53 54 //逆にして結果を表示 55 for (int j = (pointX - 1); j >= 0; j--){ 56 for (int k = 0; k < pointY; k++){ 57 System.out.print(ans[j][k]); 58 } 59 System.out.println(); 60 } 61 } 62} 63コード

追加:
イメージ説明

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

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

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

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

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

kuma_kuma_

2020/10/09 08:20 編集

質問者様 > 多次元配列に#と.が格納されています。 > その#が格納されているところだけを、奥行を正面としたら#がどういう風に見えるのかという課題です。 まず問題からするとはじめ形状が正六面体を想定していると思いましたが そうすると面に必要な座標が4点必要になるはずです。 でも質問者様の質問では3点しかありません。それでは三角錐を想定でしょうか? あと「見え方」の表現も気になります。 正六面体なら「側面」「後方」との答えもできますが 三角錐の場合「見え方」に対してなんと答えれば良いのでしょうか?
kinako_make

2020/10/09 08:30

説明が下手ですみません。 図のがわかりやすいので追加しました。 四角形の立体は多次元配列とは言わないのでしょうか? 調べたところ、3次元配列は多次元配列とでてきたので。
kuma_kuma_

2020/10/09 08:31

追加の資料ありがとうございます。 これで問題の意味が判りました。 解説別にします。
guest

回答1

0

ベストアンサー

追加され図を拝見しました。
プログラム自体の提示は課題の答えに対して不適切かと思い文章の説明とします。

まずデータはdata[Z][X][Y]とし
まず1方向から見た場合となりますので
今回の場合ans[Z][Y]に結果が反映されるとします。
そうしたらxを最少(一番奥から)から最大までをループとして値を設定します。
例 Xが0~2の場合
ans[Z][Y] = data[Z][0][Y]
ans[Z][Y] = data[Z][1][Y]
ans[Z][Y] = data[Z][2][Y]

この時ひとつの条件を付けます
data[Z][X][Y]が'.'の場合(空の場合)、
ans[Z][Y]に値を設定しない。

これにより配列が重なった場合は最終的な面(配列)の値が残ります。

ただ質問者様の場合でも
・違う結果
・ランタイムエラー
は無いかと思いますが...

質問者様の場合が処理を逆にしているので
(検索および判定)
例えば'#'と'*'が配列に設定されている場合などは対応ができなくはなっています。

(問題自体にそのような条件付けがあれば別ですが。)

投稿2020/10/09 08:48

kuma_kuma_

総合スコア2506

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

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

kinako_make

2020/10/09 09:03

ありがとうございます。 処理が逆だったんですね! アドバイスをもとに考えなしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問