第19講 .NETによるマルチスレッドプログラミング
第7話 Parameterizedによって関数を1つにまとめる
コード例
#include<iostream>
using namespace std;
using namespace System;
using namespace System::Threading;
void f0();
void t(Object^ a);
void f1(char p,char g);
void f2(char p);
void g(char p);
int n,cn[4];
int m[4][2000][10][10],a[4][10][10],x[100],y[100];
int main(){
cout<<"何次魔方陣を作成させるのかキーボードから入力してください。"<<endl;
cout<<"次数=";
scanf("%d",&n);
DateTime^ hj=DateTime::Now;
f0();
Thread^ p=gcnew Thread(gcnew ParameterizedThreadStart(t));
Thread^ q=gcnew Thread(gcnew ParameterizedThreadStart(t));
Thread^ r=gcnew Thread(gcnew ParameterizedThreadStart(t));
Thread^ s=gcnew Thread(gcnew ParameterizedThreadStart(t));
p->Start(0);
q->Start(1);
r->Start(2);
s->Start(3);
p->Join();
q->Join();
r->Join();
s->Join();
//for(int i=0;i<4;i++)g(i);
cout<<n<<"次魔方陣が"<<cn[0]+cn[1]+cn[2]+cn[3]<<"個できました。"<<endl;
DateTime^ ow=DateTime::Now;
TimeSpan sa=ow->Subtract(*hj);
cout<<"計算時間は"<<sa.TotalSeconds<<"秒です。"<<endl;
/*
int i,j,c[10][10];
for(i=0;i<n*n;i++){
c[y[i]][x[i]]=i;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(c[i][j]<10)cout<<" "<<c[i][j]<<" ";
if(c[i][j]>=10)cout<<c[i][j]<<" ";
}
cout<<endl;
}
*/
}
void f0(){
int i,j,c=0;
int b[10][10];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
b[i][j]=-1;
}
}
for(i=0;i<n;i++){
b[i][i]=i;
}
c=n-1;
for(i=0;i<n;i++){
if(b[i][n-1-i]==-1){
c++;
b[i][n-1-i]=c;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(b[i][j]==-1){
c++;
b[i][j]=c;
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
x[b[i][j]]=j;
y[b[i][j]]=i;
}
}
}
void t(Object^ a){
char i;
i=(Int32)a;
cn[i]=0;
f1(i,0);
}
void f1(char p,char g){
char i,j,ii;
char h,w,hh=1;
for(i=1;i<n*n+1;i++){
if(p==0)if(g==0 && i>n*n/4)break;
if(p==1){
if(g==0){
if(hh==1){
i+=n*n/4;
hh=2;
}
if(i>n*n/2)break;
}
}
if(p==2){
if(g==0){
if(hh==1){
i+=n*n/2;
hh=2;
}
if(i>3*n*n/4)break;
}
}
if(p==3){
if(g==0){
if(hh==1){
i+=3*n*n/4;
hh=2;
}
}
}
a[p][y[g]][x[g]]=i;
h=1;
if(g>0){
for(j=0;j<g;j++){
if(a[p][y[g]][x[g]]==a[p][y[j]][x[j]]){
h=0;
break;
}
}
}
if(h==1 && y[g]==n-1 && x[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=a[p][j][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1 && y[g]==n-1 && x[g]==0){
w=0;
for(j=0;j<n;j++){
w+=a[p][n-1-j][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1 && y[g]==0 && x[g]==n-2){
w=0;
for(j=0;j<n;j++){
w+=a[p][y[g]][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1 && g>n && x[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=a[p][y[g]][j];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1 && y[g]==n-2 && x[g]==0){
w=0;
for(j=0;j<n;j++){
w+=a[p][j][x[g]];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1 && g>2*n-1 && y[g]==n-1){
w=0;
for(j=0;j<n;j++){
w+=a[p][j][x[g]];
}
if(w!=n*(n*n+1)/2)h=0;
}
if(h==1){
if(g+1<n*n){
f1(p,g+1);
}
else{
cn[p]++;
f2(p);
//if(cn[i]==2000)break;
}
}
//if(cn[i]==2000)break;
}
}
void f2(char p){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
m[p][cn[p]-1][i][j]=a[p][i][j];
}
}
}
void g(char p){
int i,j,k;
for(i=0;i<cn[i];i++){
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(m[p][i][j][k]<10)cout<<" "<<m[p][i][j][k]<<" ";
if(m[p][i][j][k]>=10)cout<<m[p][i][j][k]<<" ";
}
cout<<endl;
}
cout<<endl;
}
}
Parameteriedによってかなりすっきしました。
すっきりさせる際のポイントは、cn1などの配列にすることです。
それで
void t(Object^ a){
char i;
i=(Int32)a;
cn[i]=0;
f1(i,0);
}
とすっきりさせることができました。
第6話へ 第20講第1話へ
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)