void CSuudoku01View::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
CView::OnRButtonUp(nFlags, point);
CSuudoku01Doc* pDoc = GetDocument();
CNumsetDlg dlg;
int ix;
int iy;
CString str0;
int temp_ix;
int temp_ix2;
int hit_flg;
int temp_data;
BOOL bad_flg;
CWnd* pCWnd = this;
HWND hWnd = pCWnd->m_hWnd;
CRect lp_Rect;
GetWindowRect(lp_Rect); // メインページの座標
ix = point.x - offset_x;
iy = point.y - offset_y;
if (ix >= 0 && iy >= 0) {
ix = ix / font_height;
iy = iy / font_height;
if (ix < 9 && iy < 9) {
dlg.m_dlgpos_x = point.x + lp_Rect.left;
dlg.m_dlgpos_y = point.y + lp_Rect.top;
if (dlg.DoModal() == IDOK) {
//str0.Format(_T("ix = %d iy = %d インデックス = %d "),ix,iy,dlg.m_rad01);
//MessageBox(str0);
if (dlg.m_rad01 == 9) {
temp_data = pDoc->data_k[ix][iy];
if (temp_data == 0) {
return;
}
hit_flg = 0;
if (pDoc->data_n[iy] == 0) {
pDoc->data_m[0][iy] = temp_data;
}
else {
temp_ix2 = pDoc->data_n[iy];
for (temp_ix = 8; temp_ix > 0; temp_ix--) {
pDoc->data_m[temp_ix][iy] = pDoc->data_m[temp_ix - 1][iy];
if (pDoc->data_m[temp_ix][iy] < temp_data) {
//str0.Format(_T("ヒット x = %d y = %d data = %d "), temp_ix, iy, temp_data);
//MessageBox(str0);
hit_flg = 1;
pDoc->data_m[temp_ix][iy] = temp_data;
break;
}
}
if (!hit_flg) {
pDoc->data_m[0][iy] = temp_data;
}
}
//MessageBox(_T("インデックスを1加算"));
pDoc->data_n[iy]++;
pDoc->data_k[ix][iy] = 0;
pDoc->data_l[ix][iy] = 0;
}
else {
temp_data = dlg.m_rad01 + 1;
bad_flg = check_ix_iy(pDoc, ix, iy, temp_data);
if (!bad_flg) {
for (temp_ix = 0; temp_ix < pDoc->data_n[iy]; temp_ix++) {
if (pDoc->data_m[temp_ix][iy] == temp_data) {
//str0.Format(_T("ヒット x = %d y = %d data = %d "), temp_ix, iy, temp_data);
//MessageBox(str0);
for (temp_ix2 = temp_ix; temp_ix2 < pDoc->data_n[iy]; temp_ix2++) {
if (temp_ix2 == 8) {
pDoc->data_m[temp_ix2][iy] = 10;
}
else {
pDoc->data_m[temp_ix2][iy] = pDoc->data_m[temp_ix2 + 1][iy];
}
}
break;
}
}
pDoc->data_n[iy]--;
pDoc->data_k[ix][iy] = temp_data;
pDoc->data_l[ix][iy] = 1;
}
}
pDoc->UpdateAllViews(NULL);
}
}
}
else {
}
}
下記のプログラムが、盤面のその場所(x,y)にtemp_dataに入っているものが置けるかどうかのチェックルーチンである。
見ていて、あまりにもダサいのとアホらしいコーディングを書いてしまったので、見直すのも嫌になってしまったので、途中までで以下省略とする。
これだけ見ても、ダサさは十分に伝わると思う。
BOOL CSuudoku01View::check_ix_iy(CSuudoku01Doc* pDoc,int chkix, int chkiy,int temp_data)
{
int temp_ix;
int temp_iy;
BOOL bad_flg;
bad_flg = FALSE;
if (pDoc->data_k[chkix][chkiy] != 0) {
return TRUE;
}
for (temp_ix = 0; temp_ix < 9; temp_ix++) {
if (pDoc->data_k[temp_ix][chkiy] == temp_data) {
return TRUE;
}
}
if (chkiy == 0) {
for (temp_iy = 1; temp_iy < 3; temp_iy++) {
if (chkix < 3) {
for (temp_ix = 0; temp_ix < 3; temp_ix++) {
if (pDoc->data_k[temp_ix][temp_iy] == temp_data) {
return TRUE;
}
}
}
else if (chkix < 6) {
for (temp_ix = 3; temp_ix < 6; temp_ix++) {
if (pDoc->data_k[temp_ix][temp_iy] == temp_data) {
return TRUE;
}
}
}
メニューから実行を選ぶと、この処理で実行フラグを1にするのと、解答数を0にリセットするだけである。
実際の計算処理はOnDrawから呼び出されるsub_EXEC_iy0で行っているのだが、たぶん本来のウインドウズの処理としは、いけないことをやっているのである。
本当の設計としては、ここから別スレッドを起こして実行処理を行い、実行の結果を何らかのパイプなり共有メモリ(なんと懐かしい響き)で画面の処理に送るべきなのであろう。
しかし、今回はメンドクサイので(こればっかり)処理をしては表示されるというのを一連のプログラムで書いてしまったのである。
void CSuudoku01View::On32773()
{
// TODO: ここにコマンド ハンドラー コードを追加します。
CSuudoku01Doc* pDoc = GetDocument();
if (MessageBox(_T("実行します。"), _T("実行"), MB_OKCANCEL) == IDOK) {
exec_flg = 1;
pDoc->counter_all = 0;
pDoc->UpdateAllViews(NULL);
}
}
これが再描画のルーチンである。
見慣れない処理が最初の頃に出てくる。
pDC->SetBkMode(TRANSPARENT);というのは、こちらで指定したフォントで文字を書いた場合に、背景色とフォントのバックカラーがずれる場合があるので記述している。
色々な背景色の場所に、同じフォントで書くとずれが発生する。
hfontDC = pDC->operator HDC();というのは、これもフォント関係で、フォントそのものの色を変える場合、デバイスコンテキストのハンドルが必要になるので、その取得である。
void CSuudoku01View::sub_Draw2(CSuudoku01Doc* pDoc,CDC* pDC)
{
CFont font1;
TEXTMETRIC tm1;
CStringW str0;
HDC hfontDC;
COLORREF font_col;
int font_offset_x = 8;
int font_offset_y = 1;
CPen pen1(PS_SOLID, 3, RGB(0, 0, 0));
CPen* old_pen;
int temp0;
int temp1;
int temp2;
int temp3;
//===========================================================
pDC->SetBkMode(TRANSPARENT);
hfontDC = pDC->operator HDC();
//===========================================================
font1.CreateFontW(font_height, 0, 0, 0, FW_HEAVY, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial"));
pDC->SelectObject(&font1);
pDC->GetTextMetrics(&tm1);
font_height = tm1.tmHeight;
font_width = tm1.tmAveCharWidth;
//str0.Format(_T("フォントの幅 = %d ピクセル 高さ = %d ピクセル"),font_width,font_height);
//MessageBox(str0);
//===========================================================
pDC->FillSolidRect(offset_x, offset_y, font_height * 9, font_height * 9, RGB(255, 255, 255));
pDC->FillSolidRect(offset_x, offset_y, font_height * 3, font_height * 3, RGB(64, 255, 0));
pDC->FillSolidRect(offset_x + font_height * 6, offset_y, font_height * 3, font_height * 3, RGB(64, 255, 0));
pDC->FillSolidRect(offset_x + font_height * 3, offset_y + font_height * 3, font_height * 3, font_height * 3, RGB(64, 255, 0));
pDC->FillSolidRect(offset_x, offset_y + font_height * 6, font_height * 3, font_height * 3, RGB(64, 255, 0));
pDC->FillSolidRect(offset_x + font_height * 6, offset_y + font_height * 6, font_height * 3, font_height * 3, RGB(64, 255, 0));
pDC->MoveTo(offset_x, offset_y);
temp1 = offset_y;
pDC->LineTo(offset_x + font_height * 9, temp1);
for (temp0 = 0; temp0 < 9; temp0++) {
temp1 = temp1 + font_height;
pDC->MoveTo(offset_x, temp1);
pDC->LineTo(offset_x + font_height * 9, temp1);
}
pDC->MoveTo(offset_x, offset_y);
temp1 = offset_x;
pDC->LineTo(temp1, offset_y + font_height * 9);
for (temp0 = 0; temp0 < 9; temp0++) {
temp1 = temp1 + font_height;
pDC->MoveTo(temp1, offset_y);
pDC->LineTo(temp1, offset_y + font_height * 9);
}
old_pen = pDC->SelectObject(&pen1);
pDC->MoveTo(offset_x, offset_y);
temp1 = offset_y;
pDC->LineTo(offset_x + font_height * 9, temp1);
for (temp0 = 0; temp0 < 3; temp0++) {
temp1 = temp1 + font_height * 3;
pDC->MoveTo(offset_x, temp1);
pDC->LineTo(offset_x + font_height * 9, temp1);
}
pDC->MoveTo(offset_x, offset_y);
temp1 = offset_x;
pDC->LineTo(temp1, offset_y + font_height * 9);
for (temp0 = 0; temp0 < 3; temp0++) {
temp1 = temp1 + font_height * 3;
pDC->MoveTo(temp1, offset_y);
pDC->LineTo(temp1, offset_y + font_height * 9);
}
pDC->SelectObject(old_pen);
//===========================================================
temp2 = offset_x + font_offset_x;
temp3 = offset_x + font_offset_y;
for (temp0 = 0; temp0 < 9; temp0++) {
for (temp1 = 0; temp1 < 9; temp1++) {
if (pDoc->data_l[temp1][temp0] != 0) {
str0.Format(_T("%d"), pDoc->data_k[temp1][temp0]);
//MessageBox(str0);
if (pDoc->data_l[temp1][temp0] == 1) {
font_col = SetTextColor(hfontDC, RGB(0, 0, 0));
}
else {
font_col = SetTextColor(hfontDC, RGB(255, 0, 255));
}
pDC->TextOutW(temp2, temp3, str0);
font_col = SetTextColor(hfontDC, font_col);
}
temp2 = temp2 + font_height;
}
temp2 = offset_x + font_offset_x;
temp3 = temp3 + font_height;
}
}
今回はちょっと大きめの図柄で描いているいるのでフォントも大きくする。
その方が色の変化が見やすいのである。
30ピクセルのフォントを使用してみたが、枠の外に描いてあるシステムのフォントと比べてみると、だいぶ大きい。
これが1行目の順列組み合わせの処理である。
なんだかダサい作りで我ながら嫌になってしまうのだが、まぁ、これが自分の実力なのだろう。
新人研修とかで私が何時も言っていたのは、「良いプログラムは、解りやすく、素直に作るのが良い」などと言っていたのである。
そして「モットーとしては、小さく、早く、美しく作るべし!!」などと言っていたのであるが、どうも「自分でも出来ないことを教えていた」という気分になるのである。
void CSuudoku01View::sub_EXEC_iy0(CSuudoku01Doc* pDoc, CDC* pDC)
{
//MessageBox(_T("実行処理スタートiy0"), _T("実行"), MB_OKCANCEL);
int ix0;
int ix1;
int ix2;
int ix3;
int ix4;
int ix5;
int ix6;
int ix7;
int ix8;
int ix_com0;
int ix_com1;
int ix_com2;
int ix_com3;
int ix_com4;
int ix_com5;
int ix_com6;
int ix_com7;
int ix_com8;
int iy;
int ix_loop;
int temp_m;
CStringW str0;
int count_iy0;
count_iy0 = 0;
iy = 0;
ix_loop = pDoc->data_n[iy];
if (ix_loop == 0) {
//sub_Draw2(pDoc, pDC);
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix0 = 0; ix0 < ix_loop; ix0++) {
temp_m = pDoc->data_m[0][iy];
pDoc->data_m[0][iy] = pDoc->data_m[ix0][iy];
pDoc->data_m[ix0][iy] = temp_m;
for (ix_com0 = 0; ix_com0 < 9; ix_com0++) {
if (pDoc->data_k[ix_com0][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[0][iy];
if (!check_ix_iy(pDoc, ix_com0, iy, temp_m)) {
//MessageBox(_T("次行けます0"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com0][iy] = pDoc->data_m[0][iy];
pDoc->data_l[ix_com0][iy] = 2;
if (ix_loop == 1) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix1 = 1; ix1 < ix_loop; ix1++) {
temp_m = pDoc->data_m[1][iy];
pDoc->data_m[1][iy] = pDoc->data_m[ix1][iy];
pDoc->data_m[ix1][iy] = temp_m;
for (ix_com1 = ix_com0; ix_com1 < 9; ix_com1++) {
if (pDoc->data_k[ix_com1][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[1][iy];
if (!check_ix_iy(pDoc, ix_com1, iy, temp_m)) {
//MessageBox(_T("次行けます1"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com1][iy] = pDoc->data_m[1][iy];
pDoc->data_l[ix_com1][iy] = 2;
if (ix_loop == 2) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix2 = 2; ix2 < ix_loop; ix2++) {
temp_m = pDoc->data_m[2][iy];
pDoc->data_m[2][iy] = pDoc->data_m[ix2][iy];
pDoc->data_m[ix2][iy] = temp_m;
for (ix_com2 = ix_com1; ix_com2 < 9; ix_com2++) {
if (pDoc->data_k[ix_com2][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[2][iy];
if (!check_ix_iy(pDoc, ix_com2, iy, temp_m)) {
//MessageBox(_T("次行けます2"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com2][iy] = pDoc->data_m[2][iy];
pDoc->data_l[ix_com2][iy] = 2;
if (ix_loop == 3) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix3 = 3; ix3 < ix_loop; ix3++) {
temp_m = pDoc->data_m[3][iy];
pDoc->data_m[3][iy] = pDoc->data_m[ix3][iy];
pDoc->data_m[ix3][iy] = temp_m;
for (ix_com3 = ix_com2; ix_com3 < 9; ix_com3++) {
if (pDoc->data_k[ix_com3][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[3][iy];
if (!check_ix_iy(pDoc, ix_com3, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com3][iy] = pDoc->data_m[3][iy];
pDoc->data_l[ix_com3][iy] = 2;
if (ix_loop == 4) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix4 = 4; ix4 < ix_loop; ix4++) {
temp_m = pDoc->data_m[4][iy];
pDoc->data_m[4][iy] = pDoc->data_m[ix4][iy];
pDoc->data_m[ix4][iy] = temp_m;
for (ix_com4 = ix_com3; ix_com4 < 9; ix_com4++) {
if (pDoc->data_k[ix_com4][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[4][iy];
if (!check_ix_iy(pDoc, ix_com4, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com4][iy] = pDoc->data_m[4][iy];
pDoc->data_l[ix_com4][iy] = 2;
if (ix_loop == 5) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix5 = 5; ix5 < ix_loop; ix5++) {
temp_m = pDoc->data_m[5][iy];
pDoc->data_m[5][iy] = pDoc->data_m[ix5][iy];
pDoc->data_m[ix5][iy] = temp_m;
for (ix_com5 = ix_com4; ix_com5 < 9; ix_com5++) {
if (pDoc->data_k[ix_com5][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[5][iy];
if (!check_ix_iy(pDoc, ix_com5, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com5][iy] = pDoc->data_m[5][iy];
pDoc->data_l[ix_com5][iy] = 2;
if (ix_loop == 6) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix6 = 6; ix6 < ix_loop; ix6++) {
temp_m = pDoc->data_m[6][iy];
pDoc->data_m[6][iy] = pDoc->data_m[ix6][iy];
pDoc->data_m[ix6][iy] = temp_m;
for (ix_com6 = ix_com5; ix_com6 < 9; ix_com6++) {
if (pDoc->data_k[ix_com6][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[6][iy];
if (!check_ix_iy(pDoc, ix_com6, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com6][iy] = pDoc->data_m[6][iy];
pDoc->data_l[ix_com6][iy] = 2;
if (ix_loop == 7) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix7 = 7; ix7 < ix_loop; ix7++) {
temp_m = pDoc->data_m[7][iy];
pDoc->data_m[7][iy] = pDoc->data_m[ix7][iy];
pDoc->data_m[ix7][iy] = temp_m;
for (ix_com7 = ix_com6; ix_com7 < 9; ix_com7++) {
if (pDoc->data_k[ix_com7][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[7][iy];
if (!check_ix_iy(pDoc, ix_com7, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com7][iy] = pDoc->data_m[7][iy];
pDoc->data_l[ix_com7][iy] = 2;
if (ix_loop == 8) {
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
}
else {
for (ix8 = 8; ix8 < ix_loop; ix8++) {
temp_m = pDoc->data_m[8][iy];
pDoc->data_m[8][iy] = pDoc->data_m[ix8][iy];
pDoc->data_m[ix8][iy] = temp_m;
for (ix_com8 = ix_com7; ix_com8 < 9; ix_com8++) {
if (pDoc->data_k[ix_com8][iy] == 0) {
break;
}
}
temp_m = pDoc->data_m[8][iy];
if (!check_ix_iy(pDoc, ix_com8, iy, temp_m)) {
//MessageBox(_T("次行けます3"), _T("実行中"), MB_OKCANCEL);
pDoc->data_k[ix_com8][iy] = pDoc->data_m[8][iy];
pDoc->data_l[ix_com8][iy] = 2;
//sub_Draw2(pDoc, pDC);
count_iy0++;
sub_EXEC_iy1(pDoc, pDC);
//MessageBox(_T("ステップ2"));
//MessageBox(_T("終了0"), _T("実行中"), MB_OKCANCEL);
if (exec_flg == 0) {
return;
}
pDoc->data_k[ix_com8][iy] = 0;
pDoc->data_l[ix_com8][iy] = 0;
}
temp_m = pDoc->data_m[8][iy];
pDoc->data_m[8][iy] = pDoc->data_m[ix8][iy];
pDoc->data_m[ix8][iy] = temp_m;
} // for ix8 loop end
} // ix_loop == 8 else end
pDoc->data_k[ix_com7][iy] = 0;
pDoc->data_l[ix_com7][iy] = 0;
}
temp_m = pDoc->data_m[7][iy];
pDoc->data_m[7][iy] = pDoc->data_m[ix7][iy];
pDoc->data_m[ix7][iy] = temp_m;
} // for ix7 loop end
} // ix_loop == 7 else end
pDoc->data_k[ix_com6][iy] = 0;
pDoc->data_l[ix_com6][iy] = 0;
}
temp_m = pDoc->data_m[6][iy];
pDoc->data_m[6][iy] = pDoc->data_m[ix6][iy];
pDoc->data_m[ix6][iy] = temp_m;
} // for ix6 loop end
} // ix_loop == 6 else end
pDoc->data_k[ix_com5][iy] = 0;
pDoc->data_l[ix_com5][iy] = 0;
}
temp_m = pDoc->data_m[5][iy];
pDoc->data_m[5][iy] = pDoc->data_m[ix5][iy];
pDoc->data_m[ix5][iy] = temp_m;
} // for ix5 loop end
} // ix_loop == 5 else end
pDoc->data_k[ix_com4][iy] = 0;
pDoc->data_l[ix_com4][iy] = 0;
}
temp_m = pDoc->data_m[4][iy];
pDoc->data_m[4][iy] = pDoc->data_m[ix4][iy];
pDoc->data_m[ix4][iy] = temp_m;
} // for ix4 loop end
} // if ix_loop == 4 else end
pDoc->data_k[ix_com3][iy] = 0;
pDoc->data_l[ix_com3][iy] = 0;
}
temp_m = pDoc->data_m[3][iy];
pDoc->data_m[3][iy] = pDoc->data_m[ix3][iy];
pDoc->data_m[ix3][iy] = temp_m;
} // for ix3 end
} // if ix_loop == 3 else end
pDoc->data_k[ix_com2][iy] = 0;
pDoc->data_l[ix_com2][iy] = 0;
}
temp_m = pDoc->data_m[2][iy];
pDoc->data_m[2][iy] = pDoc->data_m[ix2][iy];
pDoc->data_m[ix2][iy] = temp_m;
} // for ix2 end
} // ix_loop == 2 else end
pDoc->data_k[ix_com1][iy] = 0;
pDoc->data_l[ix_com1][iy] = 0;
}
temp_m = pDoc->data_m[1][iy];
pDoc->data_m[1][iy] = pDoc->data_m[ix1][iy];
pDoc->data_m[ix1][iy] = temp_m;
} // for ix1 end
} // ix_loop == 1 else end
pDoc->data_k[ix_com0][iy] = 0;
pDoc->data_l[ix_com0][iy] = 0;
}
temp_m = pDoc->data_m[0][iy];
pDoc->data_m[0][iy] = pDoc->data_m[ix0][iy];
pDoc->data_m[ix0][iy] = temp_m;
} // for ix0 end
} // ix_loop == 0 else end
// str0.Format(_T("実行件数iy0 = %d"), count_iy0);
// MessageBox(str0);
str0.Format(_T("全実行件数 = %d"), pDoc->counter_all);
MessageBox(str0);
}
sub_EXEC_iy1の呼び出しが2行目の計算になる。
2行目のプログラムは、このプログラムをコピーしてアチコチの名称を0->1に変え、プログラムの初めにiy = 0;としているところをiy = 1;にするだけである。
以下同文という感じでほとんど同じプログラムを回しているだけである。
ロジックでメンドクサイのが、手動でいくつもの初期値が設定されていると、その数のループの時点で2行目の処理に行くことである。
極端な場合、全ての欄に数値が入っていた場合はix_loop(pDoc->data_n[iy]の値)が0で、何もせずに2行目に行く。
テストとして、プログラムの初めの方にあるif (ix_loop == 0)の中のsub_EXEC_iy1(pDoc, pDC);をコメントにする。
また、プログラムの最後の方にあるstr0.Format(_T("実行件数iy0 = %d"), count_iy0);と次の表示している行のコメントを外し、データを設定して実行してみる。
実行結果は0件と出る。
2件のときは実行結果は2件と出る。
3件のときは実行結果は6件と出る。
要するに順列組み合わせなので、空いたエリアの数の階乗の計算結果となるのである。
当然ながら何も設定せずに実行すると、9の階乗の362880件の実行結果となる。
1行目を元に戻し、2行目の処理だけを全件行うと、12096件の解答となる。
つまり、362880×12096の解答数ということらしい。
1行目、2行目を計算し、3行目の処理だけを全件行うと、216件の解答となる。
つまり、362880×12096×216の解答数ということらしい。
1〜3行目までを計算し、4行目を全件処理すると、どうやら12096件の解答がある場合と12072件の解答があるパターンがあるらしい。
解答の数が増えるたのは、3×3のマス目の制限から外れたからである。
1〜4行目までを計算し、5行目を全件処理すると、どうやら500件の解答がある場合と392件の解答があるパターンがあるらしい。
1〜5行目までを計算し、6行目を全件処理すると、どうやら8件の解答がある場合と0件の解答があるパターンがあるらしい。
1〜6行目までを計算し、7行目を全件処理すると、どうやら52〜120件の多数の解答のパターンがあるらしい。
けっこう多いので、全てのパターンを出すのは断念した。
1〜7行目までを計算し、8行目を全件処理すると、どうやら4件の解答がある場合と8件の解答があるパターンがあるらしい。
8行目まで計算してしまうと、当然ながら9行目は無条件で決まってしまうので、調査はここまでである。
もっとも、これまで出した数字が何か意味があるかと言えば、せいぜい1行目の解答数が9の階乗で計算どおりということくらいかもしれない。
プログラムが完成したので、早速、なかなか解答にたどり着けなかった問題を入れてみる。
アッというまに「全実行件数が1」と出て、ちゃんと解答は1件のみということが解る。
「めでたし、めでたし・・・・・」
当初目的の「本当は複数の解答があるやもしれン」という初期値は、出てきたらその都度ここに乗せようと思っているのである。
HOME