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

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

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

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

Q&A

解決済

3回答

217閲覧

0にするにはどうすればよいのか&0を入れ替えるには(2)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/01/09 10:35

編集2019/01/09 10:35

先ほど質問してヒントをいただいて自分で少し考えたのですがうまくいきませんでした。今同じ数字を3つ以上並んだらその数を0にして0を上にもっていくという構文を作っています。つまり0を空きとして下に詰めていく感じです。例えば

61222
61211
66777

のように書いたら

01000
01000  
06211   

のように変えたいです。まず、横を見て同じ数字が3つ以上並んだ数字に-1をかけて次に縦を見て同じようにやり、最後に-の符号がついた数字を0にするというようにやりたいです。しかし、うまくいきません。それが下のコードです。

11122
22233
55555

のようにしたら

11100
22290
00000

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

c

1#include <stdio.h> 2int main(void){ 3int i,j,k,c,d; 4printf("縦を指定してください(1~100)"); 5scanf("%d",&k) 6int puyo[100][5]; 7printf("数を入力してください"); 8for(i=0;i<k;i++){ 9 for(j=0;j<5;j++) 10 scanf("%d ,&puyo[i][j]"); 11 } 12} 13for(i=0;i<k;i++){ 14 for(j=0;j<5;j++){ 15 int len=1; 16 for(c=1;j+c<5;c++,len++){ 17 if(puyo[i][j]!=puyo[i][j+c]){ 18 puyo2[i][j]=puyo[i][j]; 19 break; 20 } 21 if(len>2){ 22 for(d=0;d<len;d++){ 23 puyo2[i][j+d]=-puyo[i][j+d]; 24 } 25 } 26 } 27 } 28 29for(j=0;j<5;j++){ 30 for(i=0;i<k;i++){ 31 int len=1; 32 for(c=1;i+c<k;c++,len++){ 33 if(puyo[i][j]!=puyo[i+c][j]){ 34 break; 35 } 36 if(len>2){ 37 for(d=1;d<=len;d++){ 38 puyo2[i][j+d]=-puyo[i][j+d]; 39 } 40 } 41 } 42 } 43 44for(i=0;i<k;i++){ 45 for(j=0;j<5;j++){ 46 if(puyo2[i][j]<0){ 47 puyo2[i][j]=0; 48 } 49 else{ 50 puyo2[i][j]=puyo2[i][j]; 51 } 52 } 53 } 54 } 55 56 for(i=0;i<k;i++){ 57 for(j=;j<5;j++){ 58 printf("%d",puyo2[i][j]); 59 } 60 printf("\n"); 61 } 62

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

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

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

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

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

dice142

2019/01/09 11:01

前回も指摘されてたと思いますが、質問文に書いている動作が確認できるプログラムを載せてください。
pepperleaf

2019/01/09 11:58

説明文だけでは何をどうしたら、良いのか分かりません。 また、数字と書いていますが、書かれている範囲では、文字として扱った方が処理が容易な気がします。
cateye

2019/01/09 13:34 編集

前の質問で聴き逃しましたが、縦方向3文字"666"が同じ場合0にするのは分かりますが、入れ替えなくていいのですか? また61222,61211,66777の場合、222を0にして、下の211と交換する(61211,61000,66777 落ちゲーならないよねw)で、777を000にして、上の000と交換。すると、61211,61000,61000になるのでは? ・・・あと先程も言いましたがpepperleafの言うように、計算するのでなければ文字で処理したほうが楽な気がします。・・・落ちゲーなら縦は上に有るもの全部落とさなきゃですね?
退会済みユーザー

退会済みユーザー

2019/01/09 13:35

自分のだとコンパイルできるので動作がどこで確認できないか教えていただけないでしょうか? また、文字のほうが楽という指摘が多くみられますがこの後スコアを入れたいと考えています。そのためどうしても数字でやりたいのです。
cateye

2019/01/09 13:41

文字列を推奨する理由は、“3個並んだのが判断しやすい&入れ替えが楽”だからです。
退会済みユーザー

退会済みユーザー

2019/01/09 13:43

わかりました。頑張ってみます。
dice142

2019/01/10 02:05

まず最初のscanfで;がなくてエラーになりますし、中括弧も合ってない、最後のfor文は初期化部が正しくないなど結構あります。 本当にこのコードでコンパイル通ってます?
退会済みユーザー

退会済みユーザー

2019/01/13 05:58

もう一回確認してみます。
guest

回答3

0

ベストアンサー

ポインタ勉強しようねっ

投稿2019/01/09 11:15

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2019/01/09 13:48

頑張ります!
guest

0

... ポインタは勉強していません ...

ポインタを使わずに書いてみました。
mat.c

c

1#include <stdio.h> 2 3#define MAX_COL (100) 4 5void show_board(int board[][5], int k) { 6 for (int i = 0; i < k; i++) { 7 for (int j = 0; j < 5; j++) { 8 printf("%d", board[i][j]); 9 } 10 printf("\n"); 11 } 12 printf("\n"); 13} 14 15void copy_board(int from[][5], int to[][5], int k) { 16 for (int i = 0; i < k; i++) { 17 for (int j = 0; j < 5; j++) { 18 to[i][j] = from[i][j]; 19 } 20 } 21} 22 23int make_board(int board[][5]) { 24 int k = 3; 25 int x[3][5] = { 26 {6, 1, 2, 2, 2}, 27 {6, 1, 2, 1, 1}, 28 {6, 6, 7, 7, 7} 29 }; 30 copy_board(x, board, k); 31 return k; 32} 33 34int make_board_form_key(int board[][5]) { 35 int k; 36 printf("縦を指定してください(1~%d)", MAX_COL); 37 scanf("%d", &k); 38 printf("数を入力してください"); 39 for (int i = 0; i < k; i++) { 40 for (int j = 0; j < 5; j++) { 41 scanf("%d", &board[i][j]); 42 } 43 } 44 return k; 45} 46 47void mark_zero(int board[][5], int k) { 48 int x[MAX_COL][5]; 49 copy_board(board, x, k); 50 // 横の連続を 0 にする 51 for (int i = 0; i < k; i++) { 52 for (int j = 1; j < 4; j++) { 53 if ((x[i][j - 1] == x[i][j]) && (x[i][j] == x[i][j + 1])) { 54 board[i][j - 1] = board[i][j] = board[i][j + 1] = 0; 55 } 56 } 57 } 58 59 // 縦の連続を 0 にする 60 for (int j = 0; j < 5; j++) { 61 for (int i = 1; i < k - 1; i++) { 62 if ((x[i - 1][j] == x[i][j]) && (x[i][j] == x[i + 1][j + 1])) { 63 board[i - 1][j] = board[i][j] = board[i + 1][j] = 0; 64 } 65 } 66 } 67} 68 69void delete_zero(int board[][5], int k) { 70 for (int j = 0; j < 5; j++) { 71 int col[MAX_COL]; 72 for (int i = 0; i < k; i++) { 73 col[i] = 0; 74 } 75 76 // board の列の下から 0 以外の数字を col の下から埋めていく 77 int p = k - 1; 78 for (int i = k - 1; i >= 0; i--) { 79 if (board[i][j] != 0) { 80 col[p] = board[i][j]; 81 p--; 82 } 83 } 84 85 // 結果を boardの列にコピーする 86 for (int i = 0; i < k; i++) { 87 board[i][j] = col[i]; 88 } 89 } 90} 91 92int main(void) { 93 int board[MAX_COL][5]; 94 int k = 0; 95 96 k = make_board(board); 97 show_board(board, k); 98 99 mark_zero(board, k); 100 show_board(board, k); 101 102 delete_zero(board, k); 103 show_board(board, k); 104}

実行例
イメージ説明

投稿2019/01/12 04:12

katoy

総合スコア22324

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

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

0

ちょっとアドバイス・・・ってほどでもないけど^^;

縦と横を同時に0にする

同時は無理じゃないですか? 落ちてから判断するか、落ちる前に判断するか?
「ぷよぷよ」やったことあれば分かりますよね?

投稿2019/01/09 13:38

cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2019/01/09 13:41

回答ありがとうございます。では十字のような場合はどのような処理が行われているのでしょうか?パズドラのような感じにしたいです。
cateye

2019/01/09 13:45

ごめん、“パズドラ”知らない++; 基本は“落ちてから判断”でしょうね
退会済みユーザー

退会済みユーザー

2019/01/09 13:49

わかりました!一回数字の考え方をやめて文字で考えてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問