第15講 関数の再帰的呼び出し
第10話 DataGridViewによる順列作成ソフトの改良その3

ではコーティングしましょう。
実行ボタンをダブルクリックして、次のように入力して下さい。
#pragma once
int n;
int a[15];
int s;
namespace 順列データグリッドビュー {
        ・
        ・
        ・
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
           n=int::Parse(textBox1->Text);
           s=0;
           f(0);
           int i;
           array<String^>^ x=gcnew array<String^>(15);
           for(i=0;i<15;i++)x[i]=L"";
           dataGridView1->Rows->Add(x);
           x[0]=L"順";x[1]=L"列";x[2]=L"総";x[3]=L"数";x[4]=L":";x[5]=s.ToString();
           for(i=6;i<15;i++)x[i]=L"";
           dataGridView1->Rows->Add(x);
        }
        void f(char g){
           int i,j,k,h;
           array<String^>^ x=gcnew array<String^>(15);
           for(i=0;i<n;i++){
             a[g]=i+1;
             h=1;
             if(g>0){
               for(j=0;j<g;j++){
                 if(a[g]==a[j]){
                   h=0;
                   break;
                 }
               }
             }
             if(h==1){
               if(g<n-1){
                 f(g+1);
               }
               else{
                 for(k=0;k<n;k++)x[k]=a[k].ToString();
                 dataGridView1->Rows->Add(x);
                 s++;
               }
             }
           }
        }
  };
}


(コピーペースト用
#pragma once
int n;
int a[15];
int s;
namespace 順列データグリッドビュー {



#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
n=int::Parse(textBox1->Text);
s=0;
f(0);
int i;
array<String^>^ x=gcnew array<String^>(15);
for(i=0;i<15;i++)x[i]=L"";
dataGridView1->Rows->Add(x);
x[0]=L"順";x[1]=L"列";x[2]=L"総";x[3]=L"数";x[4]=L":";x[5]=s.ToString();
for(i=6;i<15;i++)x[i]=L"";
dataGridView1->Rows->Add(x);
}
void f(char g){
int i,j,k,h;
array<String^>^ x=gcnew array<String^>(15);
for(i=0;i<n;i++){
a[g]=i+1;
h=1;
if(g>0){
for(j=0;j<g;j++){
if(a[g]==a[j]){
h=0;
break;
}
}
}
if(h==1){
if(g<n-1){
f(g+1);
}
else{
for(k=0;k<n;k++)x[k]=a[k].ToString();
dataGridView1->Rows->Add(x);
s++;
}
}
}
}
};
}





解説
array<String^>^ x=gcnew array<String^>(15);第15講第6話で学習した1次元CLI配列です。
お忘れの方は、第15講第6話クリックしてお復習いされて下さい。
文字型のCLI配列を定義しています。
これはローカル配列(その関数ないのみで有効)ですので、System::Void button1_Clickにおいても、void fにおいても宣言しなければなりません。
DataGridViewに1行追加するには、dataGridView1->Rows->Add(x);とすることを是非覚えて頂ければと思います。
さて、このようにして実行したときの画面例は、
となります。
普遍版と書きましたが、実際には9個の順列でもかなり計算に時間がかかります。
15個にすると一晩待っても、計算が終わっていないかもしれません。
ですから、個数の入力は10以下にすることをお勧めします。
尚、順列個数が多くなるとのように、すべてが表示されませんが、
エクセルと同じで
のFとGの境界線にカーソルをもってきて、ドラッグすれば広がり
のようになります。
ソフトを改良して、列数を16列にして16列目は幅(Width)を100ままにしておくなど皆さんで工夫されて見て下さい。

ソース例は20行下に示します。





















コーティング例
array<String^>^ x=gcnew array<String^>(16);
for(i=0;i<15;i++)x[i]=L"";
dataGridView1->Rows->Add(x);
x[10]=L"順";x[11]=L"列";x[12]=L"総";x[13]=L"数";x[14]=L":";x[15]=s.ToString();
for(i=0;i<10;i++)x[i]=L"";
dataGridView1->Rows->Add(x);


さて、少し見栄えを改良しましょう。数字が、左寄せになっているので、センタリング表示に変更させましょう。
Form1のデザインに戻り、
をクリックして、
列の編集を選んで下さい。
そして、スクロールさせて、
表示が出てきたら、DataGridViewCellStyleをクリックしてください。
すると、DataGridViewCellStyleがとなります。をクリックして、
をさらにクリックします。
そして、MiddleCenterを選んで下さい。
すべての列に対して、今の操作をして下さい。
すべて変更した後、実行すると
のようにセンタリングされています。


これにて、第15講は終了したいと思います。
次は、予告しておいた通りいよいよこの関数の再帰的呼び出しを利用した3次と4次の魔方陣に挑戦します。

そして、工夫を重ね5次6次7次8次9次10次と次数を高め、最終的には

19 20 38 39 77 78 119 120 194 195 237 238 279 280 318 319 177 178
17 18 37 40 79 80 117 118 193 196 239 240 277 278 317 320 179 180
72 70 91 89 112 109 188 186 227 225 268 265 312 310 171 169 32 29
71 69 90 92 110 111 187 185 226 228 266 267 311 309 170 172 30 31
101 104 144 142 197 199 217 220 260 258 297 299 157 160 24 22 61 63
103 102 143 141 200 198 219 218 259 257 300 298 159 158 23 21 64 62
135 136 210 211 249 250 271 272 290 291 149 150 11 12 50 51 93 94
133 134 209 212 251 252 269 270 289 292 151 152 9 10 49 52 95 96
204 202 243 241 284 281 324 322 163 161 4 1 44 42 83 81 124 121
203 201 242 244 282 283 323 321 162 164 2 3 43 41 82 84 122 123
229 232 276 274 313 315 173 176 36 34 53 55 73 76 116 114 189 191
231 230 275 273 316 314 175 174 35 33 56 54 75 74 115 113 192 190
263 264 302 303 165 166 27 28 66 67 105 106 127 128 182 183 221 222
261 262 301 304 167 168 25 26 65 68 107 108 125 126 181 184 223 224
296 294 155 153 16 13 60 58 99 97 140 137 216 214 235 233 256 253
295 293 154 156 14 15 59 57 98 100 138 139 215 213 234 236 254 255
145 148 8 6 45 47 85 88 132 130 205 207 245 248 288 286 305 307
147 146 7 5 48 46 87 86 131 129 208 206 247 246 287 285 308 306

といった、18次魔方陣や26次魔方陣などの超高次魔方陣にも挑戦していきます。


第11講第6話へ
 第12講第1話へ 第14講第10話へ 第15講第9話へ 第16講第1話へ



VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座