第19講 数独(ナンプレ)解答自動生成アプリ

第9話 数独(ナンプレ)解答自動生成アプリVer.2の完成!
アプリ例
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void f(int g); //数独(ナンプレ)を作り出す社員
void hy(); //出来た数独(ナンプレ)をコンソールに表示させる社員
void zy(); //座標を作成する社員
void sy(); //初期化:m[i][j]をすべて0として、gy[i][j],rt[i][j],br[i][j]はすべて1としておく
int cn,n;
int m[10][10]; //少し大きめに配列要素数を取っておく
int y[100],x[100];
int gy[25][25],rt[25][25],br[25][25]; //それぞれ順に行・列・ブロックの色塗りに対応
int main(){
  clock_t hj,ow;
  srand(1);
  n=9;
  hj=clock();
  zy();
  sy();
  f(0);
  ow=clock();
  printf("生成された数独(ナンプレ)は%d個です。\n",cn);
  printf("数独(ナンプレ)生成にかかった時間は%f秒です。\n",(double)(ow - hj) / CLOCKS_PER_SEC);
}
void sy(){ //初期化:m[i][j]をすべて0として、gy[i][j],rt[i][j],br[i][j]はすべて1としておく
  int i,j;
  for(i=0;i<n;i++){
    for(j=0;j<n;j++){
      m[i][j]=0;
      gy[i][j]=1; //1は白を表し、0は色を表す。
      rt[i][j]=1;
      br[i][j]=1;
    }
  }
}
void zy(){ //座標を作成する社員
  int i;
  for(i=0;i<n*n;i++){
    y[i]=i/n;
    x[i]=i%n;
  }
}
void f(int g){ //数独(ナンプレ)を作り出す社員
  int i,j,h,w,ih;
  ih=rand()%n;
  for(i=0;i<n;i++){
    h=1;
    if(gy[y[g]][((ih+i)%n)]*rt[x[g]][((ih+i)%n)]*br[3*(y[g]/3)+(x[g]/3)][((ih+i)%n)]==0)h=0;
    if(h==1){
      m[y[g]][x[g]]=((ih+i)%n)+1;
      gy[y[g]][((ih+i)%n)]=0;
      rt[x[g]][((ih+i)%n)]=0;
      br[3*(y[g]/3)+(x[g]/3)][((ih+i)%n)]=0;
      if(g+1<n*n){
        f(g+1);
        if(cn==10)return;
      }
      else{
        hy();
        cn++;
        if(cn==10)return;
      }
      gy[y[g]][((ih+i)%n)]=1;
      rt[x[g]][((ih+i)%n)]=1;
      br[3*(y[g]/3)+(x[g]/3)][((ih+i)%n)]=1;
    }
  }
  m[y[g]][x[g]]=0;
}
void hy(){ //出来た数独(ナンプレ)をコンソールに表示させる社員
  int i,j;
  for(i=0;i<n;i++){
    if(i%3==0){ //横の境界線を引く作業
      for(j=0;j<n+4;j++){
        printf("* ");
      }
      printf("\n");
    }
    for(j=0;j<n;j++){
      if(j%3==0)printf("* "); //縦の境界線を引く作業
      printf("%d ",m[i][j]);
      if(j==8)printf("* "); //最後の縦の境界線を引く作業
    }
    printf("\n");
    if(i==8){
      for(j=0;j<n+4;j++){
        printf("* "); //最後の横の境界線を引く作業
      }
      printf("\n");
    }
  }
  printf("\n");
}
数独(ナンプレ)解答自動生成アプリVer.2

この後も数独(ナンプレ)には何度も挑戦します。
数独を解くソフト、数独問題自動生成アプリ等です。
ヒント数0から数独の解答を作り出すことが一番簡単で、
数独問題自動生成が一番難しいのです。
開発の難易度は、
数独解答自動生成ソフト<数独を解くソフト<数独を生成するソフト
ということになります。
本講第4部の主題は、数独自動生成アプリの開発であることは、
前にも述べたとおりです。

さて、第2部最後の講義である第20講では、
n進数を10進数に翻訳するソフトに挑戦します。
これもすでに述べたとおり、
本講第5部の主題は、
n進数演算による巨大素数と完全数の研究です。
nに100、1000、10000、・・・、100000000等を代入すると、
何百桁クラスの演算(足し算、引き算、かけ算、割り算など)が可能になり、
670桁ぐらいの完全数が見つけられるようになります。
私の記憶によりますと、
最大の素数や完全数は5千万桁クラスですから、
世界最高クラスにはほど遠いのですが、
工夫を重ねれば、普通のパソコンでもできようになるはずです。
世界第1位の桁数の素数は、800台のコンピュータをつなげて、
作り上げていますし、
その前の記録である世界第2位の素数は、
世界中で協力できる方のコンピュータをつなげて作ったそうです。
第2位の記録の方は、結局何台つなげたのかは分かりませんが、
協力を世界中に募ったということは、
少なく見積もっても10万台は下らないでしょう。
10万台以上のコンピュータを連携させて作った記録の2倍の桁数を、
たったの800台で行ってしまった・・・・のです。
プログラミングの仕方によって、
大きな跳躍が可能になるのです。
小学生でC言語に挑戦している能力も意欲も高い、
君たちならたった1つのコンピュータで世界記録樹立も決して夢ではない・・・
と私は思いますよ。
私の能力では無理ですが。
未来のある君たちなら!!!!!!




第8話へ 第20講第1話へ

a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門

数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ