アプリ版:「スタンプのみでお礼する」機能のリリースについて

このプログラムを
#include<stdio.h>
int x,y;

int n;
void RUL(int n),DLU(int n),LDR(int n),URD(int n);
main() {
scanf("%d",&n);
printf("#位相%dのヒルベルト曲線\n",n);
x=0; y=0;printf("(%d %d) \n)",x,y);
RUL(n);
}
void RUL(int n) {
if(n<=0) {return;}
URD(n-1);x=x+1;printf("(%d %d)\n",x,y);
RUL(n-1);y=y+1;printf("(%d %d)\n",x,y);
RUL(n-1);x=x-1;printf("(%d %d)\n",x,y);
DLU(n-1);
}
void DLU(int n) {
if(n<=0) {return;}
LDR(n-1);y=y-1;printf("(%d %d)\n",x,y);
DLU(n-1);x=x-1;printf("(%d %d)\n",x,y);
DLU(n-1);y=y+1;printf("(%d %d)\n",x,y);
RUL(n-1);
}
void LDR(int n) {
if(n<=0) {return;}
DLU(n-1);x=x-1;printf("(%d %d)\n",x,y);
LDR(n-1);y=y-1;printf("(%d %d)\n",x,y);
LDR(n-1);x=x+1;printf("(%d %d)\n",x,y);
URD(n-1);
}
void URD(int n) {
if(n<=0) {return;}
RUL(n-1);y=y+1;printf("(%d %d)\n",x,y);
URD(n-1);x=x+1;printf("(%d %d)\n",x,y);
URD(n-1);y=y-1;printf("(%d %d)\n",x,y);
LDR(n-1);
}
実行結果は
(0 0)
(0 1)



(0 254)
(0 255)
になります。これを2次元配列で表したのですがどのようにいじればいいでしょうか?おねがいします。

A 回答 (3件)

2次元配列ではなくて構造体の配列の方が扱いやすいかもしれませんね。

サンプルはこんな感じです。ヒルベルトの走査はなるべく短く書いてみました。やり方は違いますが同じ座標列になるはずです。

#include <stdio.h>
#include <stdlib.h>
/* データ用変数 */
struct xy {
 int x;
 int y;
} *hil;

int idx;

/* ヒルベルトスキャン */
void hilbert(int n, int p, int x, int y) {
 if (n>1) {
  hilbert(n/2, (p+4)%8, x+(p&1)*(n/2), y+((p>>1)&1)*(n/2));
  hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2));
  hilbert(n/2, p, x+(~p&1)*(n/2), y+(~(p>>1)&1)*(n/2));
  hilbert(n/2, 7-p, x+(~((p>>1)^(p>>2))&1)*(n/2), y+((p^(p>>2))&1)*(n/2));
 } else {
  hil[idx].x=x; hil[idx].y=y; idx++;
 }
}

int main(void) {
 int i,n;
 /* nの入力と領域確保 */
 printf("n? "); scanf("%d",&n);
 if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {
  printf("malloc error\n"); return -1;
 }
 /* ヒルベルトスキャン */
 idx=0; hilbert((1<<n),4,0,0);
 /* データ表示 */
 for (i=0; i<idx; i++) {
  printf("%d (%d %d)\n",i,hil[i].x,hil[i].y);
 }
 /* 領域開放 */
 free(hil);
 return 0;
}

この回答への補足

ありがとうございます。試してみます。

補足日時:2004/11/10 16:46
    • good
    • 0
この回答へのお礼

うまくいきませんでした><。
hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2));
で関数'hilbert'への引数が少なすぎますとでます後
if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {
で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。
どうしたいいでしょうか?

お礼日時:2004/11/12 01:42

>hilbert(n/2, p, x+((((p>>1)^(p>>2)))&1)*(n/2), y+(~(p^(p>>2))&1)*(n/2));


>で関数'hilbert'への引数が少なすぎますとでます後

わかりません。他の場所でタイプミスでしょうか?これだけ見ると引数はちゃんと4個ありますね・・・

>if((hil=malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {
>で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。

無視しても大丈夫だと思いますが (struct xy*)でキャストしてください。if((hil=(struct xy*)malloc(sizeof(struct xy)*(1<<n)*(1<<n)))==NULL) {

この回答への補足

コンパイルはできました!実行するとセグメンテーション違反ですとエラーが出てしまいました。

補足日時:2004/11/15 20:33
    • good
    • 0
この回答へのお礼

うまく実行できました。ありがとうございました!!!

お礼日時:2004/11/16 19:53

2次元配列には何が入るのでしょうか。


例えば、int zahyou[][] があったとして、zahyou[x][y]に何番目の座標か入れたい?
配列サイズがnで変わるので2次元配列は無理だと思います。1次元配列ならなんとか。。。

グローバル変数にint cnt=0;とint *zahyou; を定義して、nが確定したところで、zahyou=malloc(sizeof(int)*(1<<n)*(1<<n));で領域確保して、printfの後ろにzahyou[x+(1<<n)*y]=cnt++;とか入れてやれば1次元配列になります。。。

マクロで、
#define hairetu(x,y) *(zahyou+x+y*(1<<n))
ってやれば、hairetu(x,y)=cnt++; という風に2次元配列っぽく書けますが。。

この回答への補足

nを10としてやればどうですか?
x y
0 (0 0)
1 (0 1)



254 (0 254)
255 (0 255)
と表示したいです。

補足日時:2004/11/10 14:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!