第19講 魔方陣汎用的生成プログラムVer.2
第5話 魔方陣汎用的生成プログラムVer.2仮完成
解答コード例
import java.io.*;
class x1{
public static int[] x=new int[100];
public static int[] y=new int[100];
public static int[][] m=new int[20][20];
public static int n,cn;
public static void main(String args[]) throws IOException {
BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
System.out.println("何次魔方陣を生成させますか。");
System.out.print ("n=");
n=Integer.parseInt(a.readLine());
double hj = System.currentTimeMillis();
cn=0;
z();
f(0);
double ow = System.currentTimeMillis();
System.out.println();
System.out.println(n+"次魔方陣が"+cn+"個できました。");
System.out.println("魔方陣の探索にかかった時間は"+(ow-hj)/1000+"秒です。");
}
public static void z(){
int i,j,p;
int[][] a=new int[20][20];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
a[i][j]=n*n;
}
}
for(i=0;i<n;i++){
a[i][i]=i;
}
p=n;
for(i=0;i<n;i++){
if(a[i][n-1-i]==n*n){
a[i][n-1-i]=p;
p++;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(a[i][j]==n*n){
a[i][j]=p;
p++;
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
y[a[i][j]]=i;
x[a[i][j]]=j;
}
}
}
public static void f(int g){
int i,j,k,h,w;
for(i=1;i<n*n+1;i++){
h=1;
m[y[g]][x[g]]=i;
for(j=0;j<g;j++){
if(m[y[g]][x[g]]==m[y[j]][x[j]]){
h=0;
}
}
if(h==1){
if(y[g]==n-1 && x[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=m[j][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(y[g]==n-1 && x[g]==0){
w=0;
for(j=0;j<n;j++){
w+=m[j][n-1-j];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(y[g]==0 && x[g]==n-2){
w=0;
for(j=0;j<n;j++){
w+=m[y[g]][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(x[g]==0 && y[g]==n-2){
w=0;
for(j=0;j<n;j++){
w+=m[j][x[g]];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(y[g]>0 && y[g]<n-1 && x[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=m[y[g]][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(x[g]>0 && x[g]<n-1 && y[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=m[j][x[g]];
}
if(w!=n*(n*n+1)/2)h=0;
}
}
if(h==1){
if(g+1<n*n){
f(g+1);
//if(cn>20)return;
}
else{
cn++;
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(m[j][k]<10){
System.out.print(" "+m[j][k]+" ");
}
else{
System.out.print(m[j][k]+" ");
}
}
System.out.println();
}
System.out.println();
//if(cn>20)return;
}
}
}
}
}
Ver.1とVer.2の速度比較
Ver.1の場合
Ver.2の場合
986.246÷61.36=約16.1倍です。
4次において16倍化に成功しました。
5次、6次と次数が上がる度に倍化は大きくなります。
おそらく、6次の段階で1万倍は速くなっているでしょう。
ところが、Ver.2の今のままでは5次魔方陣はかなり高速に作れるようになりましたが、
6次魔方陣には歯が立ちません。
しかし、ちょっとした工夫でこのやり方でも7,8次ぐらいまでが可能になります。
第4話へ 第6話へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第2部
初心者のための
VC++による C言語 入門 C++ 入門 基礎から応用まで第3部