このプログラムを
#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次元配列で表したのですがどのようにいじればいいでしょうか?おねがいします。
No.2ベストアンサー
- 回答日時:
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;
}
うまくいきませんでした><。
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) {
で警告:代入より、キャストなしで整数からポインタをつくりましたとでます。
どうしたいいでしょうか?
No.3
- 回答日時:
>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) {
No.1
- 回答日時:
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)
と表示したいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
【C++】関数ポインタの使い方
-
アスタリスクで正方形
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
異なる文字列のマッチングを、D...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
ファイルから読みこむ方法
-
課題でつまってます・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報