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

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

ただいまの
回答率

90.38%

  • C

    4821questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 214

suraimu0221

score 9

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

61222
61211
66777

のように書いたら

01000
01000    
06211   

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

#include <stdio.h>
int main(void){
int i,j,k,c;
printf("縦を指定してください");
int puyo[k][5];
printf("数を入力してください");
for(i=0;i<k;i++){
     for(j=0;j<5;j++)
     scanf("%d ,&puyo[i][j]");
     }
}
for(i=0;i<k;i++){
     for(j=0;j<5;j++){
     int len=1;
          for(c=1;j+c<5;c++,len++){
          if(puyo[i][j]!=puyo[i][j+c]){
             break;
            }
          if(len>2){
            for(c=0;c<len;c++){
               puyo[i][j+c]=0;
               }
            }
          }
     }

  for(i=0;i<k;i++){
     for(j=;j<5;j++){
     printf("%d",puyo[i][j]);
     }
     printf("\n");
  }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • suraimu0221

    2019/01/09 17:32

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

    キャンセル

  • suraimu0221

    2019/01/09 17:32

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

    キャンセル

  • PineMatsu

    2019/01/10 17:11

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

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

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

  1. A配列の要素をひとつずつ見ていく
    1-1. 【その要素が0に置き換わるなら】 B配列の同じ場所に0を書き込む
    1-2. 【その要素が0に置き換わらないなら】 B配列の同じ場所にその要素の値を書き込む
  2. 全て確認したら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/15 21:22

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

6111    6000
3311 -> 3300
3311    3300

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

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

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

と数値の符号を反転させ

縦を消す場合は

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

と判定し

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4821questions

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