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

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

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

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

Q&A

解決済

3回答

992閲覧

縦横同時に0にするには&入れ替えのやり方は?

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/01/09 07:45

編集2019/01/09 08:37

今同じ数字を3つ以上並んだらその数を0にして0を上にもっていくという構文を作っています。つまり0を空きとして下に詰めていく感じです。例えば

61222
61211
66777

のように書いたら

01000 01000   06211   

のように変えたいです。横のコードは縦横の入れ替えを除いて書けました。
それが下のコードです。縦と横を同時に0にするにはどうしたらよいのかと数字を入れ替えるのはどのようにすればよいのですか?回答よろしくお願いします。
※まだポインタは勉強していません

C

1#include <stdio.h> 2int main(void){ 3int i,j,k,c; 4printf("縦を指定してください"); 5int puyo[k][5]; 6printf("数を入力してください"); 7for(i=0;i<k;i++){ 8 for(j=0;j<5;j++) 9 scanf("%d ,&puyo[i][j]"); 10 } 11} 12for(i=0;i<k;i++){ 13 for(j=0;j<5;j++){ 14 int len=1; 15 for(c=1;j+c<5;c++,len++){ 16 if(puyo[i][j]!=puyo[i][j+c]){ 17 break; 18 } 19 if(len>2){ 20 for(c=0;c<len;c++){ 21 puyo[i][j+c]=0; 22 } 23 } 24 } 25 } 26 27 for(i=0;i<k;i++){ 28 for(j=;j<5;j++){ 29 printf("%d",puyo[i][j]); 30 } 31 printf("\n"); 32 } 33 34} 35

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

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

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

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

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

cateye

2019/01/09 07:52 編集

"int puyo[k][5];'・・・Cでは、配列のサイズに変数は使用できません。動的にメモリを確保するか大きめの配列を作りましょう。
takabosoft

2019/01/09 07:52

01000 01000   06211  ↑これ間違えていません?
PineMatsu

2019/01/09 07:52

61222,61277,66222の場合、61000,61077,66000になるということですか?もしそうなら、元の値をどこかに記憶しておく必要がありますね。
退会済みユーザー

退会済みユーザー

2019/01/09 07:56

同じ数字が3つ以上並んだら0にするということです。61222,12222,66166の場合、61000,10000,66166になるということです。言葉足らずですみません。また、UNIXだと一応動くのですがどこをどのように直せばよいのでしょうか?
cateye

2019/01/09 08:03

えっと、コンパイルできないですよ。 t.c:13:1: error: expected identifier or '(' for (i = 0; i < k; i++) { main()が、このfor文の前で終わっていますd^^;
takabosoft

2019/01/09 08:05

scanfもおかしい(^_^;)
cateye

2019/01/09 08:22 編集

そもそも、intに読み込む必要有るんですかねえ? 文字列のほうが簡単なような^^;
退会済みユーザー

退会済みユーザー

2019/01/09 08:09

では自分で数字を打ち込んでやる場合はどうしたらよいのでしょうか?全く分からなくなってしまいました(泣)。ご指導よろしくお願いします。
退会済みユーザー

退会済みユーザー

2019/01/09 08:10

文字列でできるのですか?
cateye

2019/01/09 08:12

数字が3個並んだら’0’にするんですよね? 文字列は、fgets()←桁指定もできる。
takabosoft

2019/01/09 08:13

0を上に持っていく、というのは上の数値と入れ替えるって意味ですか?
退会済みユーザー

退会済みユーザー

2019/01/09 08:14

そうです。
退会済みユーザー

退会済みユーザー

2019/01/09 08:16

まだポインタは勉強していないのでそれ以外の方法で指摘していただけるとありがたいです。
cateye

2019/01/09 08:26 編集

61211と66777、01000と06211を見ると777を0にして、前行の211と入れ変えているように見えますが違いますか?
torisan

2019/01/09 08:27

察するに落ち物パズル的な動きではないかと
退会済みユーザー

退会済みユーザー

2019/01/09 08:28

おっしゃる通りです。まず、同じ数字が3つ以上並んだらその数を0にしてそのあとに上下を入れ替えるという操作をしたいです。その結果が指摘していただいた結果です。
退会済みユーザー

退会済みユーザー

2019/01/09 08:29

まさにその通りです。ですがやり方がわからず困っています。
takabosoft

2019/01/09 08:30

たぶん落ち物パズルゲームのようなものを作っているんだと思いますが、その仕様を聞かないと回答できないような・・・特に縦に3つ以上ならんだ場合に、その上の数値をどうするかが読み取れません。重力で一気に地面までぷよが落ちるタイプなのか、あくまで1ますのみ落ちてくるタイプなのか・・・
takabosoft

2019/01/09 08:32

一気に落ちるタイプであれば、消す処理と重力処理は別々に書けばいいですし。
退会済みユーザー

退会済みユーザー

2019/01/09 08:32

地面まで一気に落ちる感じです。言葉足らずですみません。
退会済みユーザー

退会済みユーザー

2019/01/09 08:32

地面まで一気に落ちる感じです。言葉足らずですみません。
PineMatsu

2019/01/10 08:11

ああ、テトリス系の落ち物パズル的な動きをさせるのですか。それなら、各数字を1文字ずつ分解して5x3の2次元配列に入れたほうが処理がしやすいと思いますが。
guest

回答3

0

6111 6000
3311 -> 3300
3311 3300

などのように、縦横どちらも消す場合
縦横を同時に消す処理をするか元の数値を記憶する必要があります。

幸いint puyo[k][5];で定義されているので
横の処理を行う時に、

c

1 puyo[i][j+c] *= -1;

と数値の符号を反転させ

縦を消す場合は

c

1 if(puyo[i][j] != puyo[i+c][j] && puyo[i][j] != -puyo[i+c][j]){

と判定し

最後に負の数値を全部0に書き換えるといいのではないでしょうか

投稿2019/01/09 08:43

asm

総合スコア15147

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

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

0

いろいろ情報が出揃ったのでふんわり書きます。

まず、横に3つ以上並んだ数値を0に書き換えてしまうと、今度は縦に3つ以上並んだものかを判定するタイミングで、先に横で0に書き換えてしまった場所がうまく判定できない、という問題が起こると思います。

この点に関しては、やり方はいろいろありますが、
「あとで消すフラグ」配列を作っておいて、すべてクリアしておきます。
横に3つ以上ならんでいるポイントにフラグを立てます。
同様に縦に3つ以上ならんでいるポイントにフラグを立てます。
そのあと、「あとで消すフラグ」が立っているポイントの元データに0を書き込めば良いと思われます。
(不備があったらごめんなさい。)

その後、重力処理を別途書けば良いです。
(こちらも書き方はいろいろありますが、まずは考えてみてください)

投稿2019/01/09 08:40

takabosoft

総合スコア8356

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

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

0

ベストアンサー

文法エラーは置いておいて方針だけ。

縦と横を同時に0にするにはどうしたらよいのか

一つの2次元配列でやろうとすると前の値がわからなくなって後半判定できなくなるので、
現在の状態を表す2次元配列(A配列)と、次の状態を表す2次元配列(B配列)を用意すれば楽です。

つまりは以下の感じですね。

  1. A配列の要素をひとつずつ見ていく

1-1. 【その要素が0に置き換わるなら】 B配列の同じ場所に0を書き込む
1-2. 【その要素が0に置き換わらないなら】 B配列の同じ場所にその要素の値を書き込む

  1. 全て確認したらB配列をA配列に書き込む

※B配列をA配列に書き込む処理は必須じゃないです。そのままB配列を表示してもいいです。


数字を入れ替えるのはどのようにすればよいのですか?

質問文に書いてないですが、おそらく0を空きとして下詰めにするのかなという想定で。
(ぷよぷよみたいな感じ?)

逆に0は上に登っていくというイメージで考えると

  1. 最後の行から1行目までの順で、各要素を見ていく(1行目は0から数えて1行目)

1-1. 要素の値が0なら、その行から0行目まで1つ上の要素と入れ替える(※)

※2行目の2列目が0なら以下のような繰り返し

  1. 2行目の2列目と1行目の2列目の値を入れ替える
  2. 1行目の2列目と0行目の2列目の値を入れ替える

っていう感じですかね。
でかい配列だった場合は無駄な0入れ替えが置きますが、まあそこは別問題ということで。

投稿2019/01/09 08:34

dice142

総合スコア5158

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

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

退会済みユーザー

退会済みユーザー

2019/01/15 12:22

この方針で考えてみたらうまくいきました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問