• ベストアンサー

アルゴリズムについて

整数nが与えられたとき、n×nのサイズで螺旋状に 0から(n×n-1)までの数字が並ぶ行列を作成し、 画面に表示するようなプログラムを教えてください。 出力するとこんな感じに表示されると思います。 n=4のとき 0 1 2 3 11 12 13 4 10 14 15 5 9 8 7 6

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

   一応できたので。 #include <stdio.h> #include <stdlib.h> int main(void) { int num, x, y, current, curr_top, i; int **square; scanf("%d", &num); if((square = (int **)malloc(num * sizeof(int *))) == NULL){ puts("Alloc Error"); } for(i = 0; i < num; i ++){ if((*(square + i) = (int *)malloc(num * sizeof(int))) == NULL){ puts("Alloc Error"); } } for(curr_top = current = 0; current < (num + 1) / 2; current ++){ x = y = current; square[x][y] = curr_top; for(i = 1; i < (num - 2 * current - 1) * 4; i ++){ if(y == current && x < num - current - 1) x ++; else if(x == num - current - 1 && y < num - current - 1) y ++; else if(y == num - current - 1 && x > current) x --; else if(x == current && y > current) y --; square[x][y] = curr_top + i; } curr_top += i; } for(y = 0; y < num; y ++){ for(x = 0; x < num; x ++){ printf("%2d ", square[x][y]); } putchar('\n'); } return 0; }  

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yukimican
  • ベストアンサー率70% (112/159)
回答No.3

#1さんではありませんが。 要は、n×nの行列に対して 「左上から螺旋状に数字を埋めていく」 というのを忠実に実行しています。 例えば、4x4の行列だと 左上(square[0][0])→右上(square[3][0]) →右下(square[n][3])→左下(square[0][3]) →左上(square[0][1]) の順に1周すると、内側に2x2の行列が残ります   0  1  2  3  11 × ×  4  10 × ×  5   9  8  7  6 それに対して、また 左上(square[1][1])→・・・と繰り返すわけです。 そうすると、   0  1  2  3  11 12 13  4  10 14 15  5   9  8  7  6 という感じで行列が埋まっているので、 1行目から順番に出力すればいいわけですね。 上を念頭に置いてソースをじっくり読めば やっていることがわかると思います。

blackandfly
質問者

お礼

説明ありがとうございます! ようやく理解できました。 ただmallocはよくわからなかったので int square[100][100]に置き換えました。 お二人とも本当にありがとうございました。 もしかしたらまたお世話になるかもしれませんw

すると、全ての回答が全文表示されます。
回答No.2

   最後の表示部分を、 temp = num * num - 1; for(i = 0; temp / 10 > 0; i ++) temp /= 10; for(y = 0; y < num; y ++){ for(x = 0; x < num; x ++){ printf("%*d ", i + 1, square[x][y]); } putchar('\n'); } に変更。  

blackandfly
質問者

お礼

すごい!ありがとうございます! あと、もしよろしければプログラムの仕組みについて 説明して頂けないでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A