第29講 細胞構成法による魔方陣の作成の普遍化△
第10話 普遍完成一歩前版
18次を加えました。
これで、20以下で出来ないのは、8次のみとなりました。
コード
#pragma once
#include<stdlib.h>
#include<math.h>
int n,nn;
int a1[30][30],a2[30][30],a3[30][30],mah[30][30],a4[30][30],mah1[30][30],p[30][30],cn1[30],cn2[30];
int x[400],y[400],xx[400],yy[400];
int s;
char sbr[24][2][2];
char sb[2][2];
char sx[4],sy[4];
char cn;
char gkh;
namespace sbk1 {
・
・
・
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
label2->Text=L"";
DateTime^ hj=DateTime::Now;
n=int::Parse(textBox1->Text);
char h=1,hh;
if(nn<3 || nn>20 || nn==8){
label2->Text=L"TextBoxには3以上20以下で8以外の整数\r\nを入力し再度実行ボタンを\r\n押して下さい。";
h=0;
}
if(h==1){
if(nn==3 || nn==4 || nn%2==1)n=nn;
if(nn%4==2)n=nn/2;
if(nn!=4 && nn%4==0)n=nn/4;
if(nn==18)n=nn/2;
}
・
・
・
if(h==1 && n!=3 && n%2==1 && nn!=10 &&
nn!=12 && nn!=14 && nn!=20){
gkh=0;
s=0;
cn=0;
hh=sh();
if(hh==0){
kf1(0);
・
・
・
}
・
・
・
void kf2(int g){
・
・
・
if(h==1){
if(g+1<n){
kf2(g+1);
}
else{
for(j=1;j<n;j++){
for(k=0;k<n;k++){
l=((n-1)*j+k)%n;
a2[j][l]=a2[0][k];
}
}
for(j=0;j<n;j++){
for(k=0;k<n;k++){
mah[j][k]=n*(a1[j][k]-1)+a2[j][k];
}
}
if(nn!=18){
array<String^>^ w=gcnew array<String^>(30);
for(j=0;j<n;j++){
for(k=0;k<n;k++){
w[k]=(mah[j][k]).ToString();
}
dataGridView1->Rows->Add(w);
}
for(j=0;j<30;j++)w[j]=L"";
dataGridView1->Rows->Add(w);
s++;
if(s==100)return;
}
if(nn==18){
zhy();
sbs(0);
g1(n);
for(j=0;j<5;j++)rand();
sbg(0);
}
}
}
}
}
}
・
・
・
・
・
・
void sbg(int g){
if(s==100)return;
int i,j,k,h,w,ii,iii,o,l;
・
・
・
if(h==1){
if(g+1<n*n){
sbg(g+1);
}
else{
if(nn!=18 && n!=3 && (n!=4 || gkh==0))f0(0);
if(nn!=18 && n==3)f1(0);
if(nn!=18 && n==4 && gkh==1)f1(0);
if(nn==18){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
for(l=0;l<2;l++){
for(o=0;o<2;o++){
mah1[2*j+l][2*k+o]=4*(mah[j][k]-1)+a3[2*j+l][2*k+o];
}
}
}
}
array<String^>^ w=gcnew array<String^>(30);
for(j=0;j<2*n;j++){
for(k=0;k<2*n;k++){
w[k]=(mah1[j][k]).ToString();
}
dataGridView1->Rows->Add(w);
}
/* これについては次話で解説します。
int kr[9][9];
for(j=0;j<n*n;j++){
kr[x[j]][y[j]]=j;
}
for(j=0;j<n;j++){
for(k=0;k<n;k++){
w[k]=(kr[j][k]).ToString();
}
dataGridView1->Rows->Add(w);
}
*/
for(j=0;j<30;j++)w[j]=L"";
dataGridView1->Rows->Add(w);
s++;
if(s==100)return;
}
}
}
}
}
・
・
・
ダウンロード用参考ファイルForm1.h
第9話へ 第11話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)