第18講 対角線法による魔方陣自動生成速度の1万倍加へ
第4話 座標作成関数(社員)コード
実行画面
n=7
00 13 14 15 16 17 07
18 01 19 20 21 08 22
23 24 02 25 09 26 27
28 29 30 03 31 32 33
34 35 10 36 04 37 38
39 11 40 41 42 05 43
12 44 45 46 47 48 06
を実現するプログラム例
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
void f(int g); //魔方陣を作り出す社員
void hy(); //出来た順列をコンソールに表示させる社員
void zy(); //座標作成社員
void hy1(int a[10][10]); //番号付けが上手くいっているかを確認する社員
int cn,n;
int m[5][5]; //少し大きめに配列要素数を取っておく
int main(){
srand(1);
printf("n=");
fflush(0); //pirntfを先に実行させるためのお呪い
scanf("%d",&n);
cn=0;
zy();
//f(0);
//printf("生成された%d次魔方陣=%d",n,cn);
}
void zy(){ //座標作成社員
int a[10][10];
int i,j,cn;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
a[i][j]=-1;
}
}
for(i=0;i<n;i++){
a[i][i]=i;
}
cn=n;
for(i=0;i<n;i++){
if(a[i][n-1-i]==-1){
a[i][n-1-i]=cn;
cn++;
}
}
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
if(a[i][j]==-1){
a[i][j]=cn;
cn++;
}
}
}
hy1(a);
}
void hy1(int a[10][10]){
int i,j;
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
if(a[i][j]<10)printf("0%d ",a[i][j]);
if(a[i][j]>=10)printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
}
void f(int g){
・
番号付けまで
さて、
n=7
00 13 14 15 16 17 07
18 01 19 20 21 08 22
23 24 02 25 09 26 27
28 29 30 03 31 32 33
34 35 10 36 04 37 38
39 11 40 41 42 05 43
12 44 45 46 47 48 06
という複雑な番号付けに成功しました。
次は、この番号と座標との関連づけです。
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
0 | 0 | 13 | 14 | 15 | 16 | 17 | 7 |
1 | 18 | 1 | 19 | 20 | 21 | 8 | 22 |
2 | 23 | 24 | 2 | 25 | 9 | 26 | 27 |
3 | 28 | 29 | 30 | 3 | 31 | 32 | 33 |
4 | 34 | 35 | 10 | 36 | 4 | 37 | 38 |
5 | 39 | 11 | 40 | 41 | 42 | 5 | 43 |
6 | 12 | 44 | 45 | 46 | 47 | 48 | 6 |
仮屋崎さんの方法とてもすばらしいのは、
ここです。
目の覚めるような方法です。
ヒントは・・・
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
y[・・・]=i;
x[・・・]=j;
}
}
でできます。
そして、hy2(int a[10][10])も作り、
本当に座標作りが正しく出来ているかを確認する
社員g()も作りましょう。
void zy(){ //座標作成社員
int a[10][10];
int i,j,cn;
・・・
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
if(a[i][j]==-1){
a[i][j]=cn;
cn++;
}
}
}
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
y[・・・]=i;
x[・・・]=j;
}
}
g(); //hy1();が外してある
}
void hy1(int a[10][10]){
int i,j;
for(i=0;i<n;i++){
for(j=0j;j<n;j++){
if(a[i][j]<10)printf("0%d ",a[i][j]);
if(a[i][j]>=10)printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
}
void g(){
・・・
hy1(a);
}
実行画面例
n=9
00 17 18 19 20 21 22 23 09
24 01 25 26 27 28 29 10 30
31 32 02 33 34 35 11 36 37
38 39 40 03 41 12 42 43 44
45 46 47 48 04 49 50 51 52
53 54 55 13 56 05 57 58 59
60 61 14 62 63 64 06 65 66
67 15 68 69 70 71 72 07 73
16 74 75 76 77 78 79 80 08
第3話へ 第5話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ