プログラミング勉強・サンプルコード
判定式の作成
前回以下の条件から各マスに入る候補を減らしていきました。
−−−
@同じ行には同じ数字が入らない
A同じ列には同じ数字が入らない
B3×3のマス(T〜\)内に同じ数字が入らない
−−−
今回は候補を減らした後にマスに入る値を確定するようにしたいと思います、
1.減らすSTEP
2.確定STEP
1、2を繰り返してすべてのマスに値が入るor変化がなくなるまでループするようにしたいと思います。
2.確定STEP用に以下の3つの関数を準備しておきます。
・conf_num = 0
確定しているマス数を数える。81の場合すべてのマスに数字が埋まっている。
・undecide_num = 0
マスに入る候補の数(つまり(row,col)に入る可能性のある数item[row][col][n]=1(n=1〜9)の数を数える。)
・candidate_num = 0
一時的にitem[row][col][n]=1であるnを保存しておくもの。
item[row][col][n]=1の数を数えundecide_numに数を保存します。
undecide_numが1であればそのマスに入る可能性のある数字は1つとなるのでconf_item[row][col]にcandidate_num(item[row][col][n]=1であるn)を入れます。
下記にソースコードを書いておきます。
ソースの説明は次回にします。
ファイルの読込み(ソースコード)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ROW 10
#define COL 10
#define N 10
int main(int argc, char* argv[]) {
int i, j, n, row, col, cnt = 0, change;
int row_matrix, col_matrix;/*matrix判定時に使用する*/
int item[ROW][COL][N], conf_item[ROW][COL];
int conf_num = 0, undecide_num = 0, candidate_num = 0;
char gomi[100];
FILE *Input_File, *Output_File;
/*Step1 初期化*/
for (row = 0; row < ROW; row++) {
for (col = 0; col < COL; col++) {
conf_item[row][col] = 0;/*初期は未定*/
for (n = 0; n < N; n++) {
item[row][col][n] = 1;/*初期はすべての数字に可能性がある*/
}
}
}
/*---File準備---*/
/*in*/
if (fopen_s(&Input_File, argv[1], "r")) {
printf("FILE OPEN FAILURE!!\n");
}
/*out*/
if (fopen_s(&Output_File, "out.txt", "w")) {
printf("FILE OPEN FAILURE!!\n");
}
printf("-----%s-----\n", argv[1]);
/*---File準備終わり---*/
/*---Step2 File読み込み---*/
for (row = 1; row < ROW; row++) {
/*conf_itemに入力データを入れ込む*/
fscanf_s(Input_File, "%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
&conf_item[row][1], &conf_item[row][2], &conf_item[row][3],
&conf_item[row][4], &conf_item[row][5], &conf_item[row][6],
&conf_item[row][7], &conf_item[row][8], &conf_item[row][9]);
}
/*itemに入力データを入れ込む。確定しているマスには該当する数字のitemに1、それ以外のitemに0を入れる。*/
printf_s("Input_File\n");
fprintf_s(Output_File, "Input_File\n");
for (row = 1; row < ROW; row++) {
for (col = 1; col < COL; col++) {
if (conf_item[row][col] != 0) {
for (n = 0; n < N; n++) {
item[row][col][n] = 0;
}
item[row][col][conf_item[row][col]] = 1;
}
printf_s("%d,", conf_item[row][col]);
fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
}
printf_s("\n");
fprintf_s(Output_File, "\n");
}
/*---item入力完了---*/
fclose(Input_File);
/*ここからStart*/
/*無限Loop。値がすべて求まったor更新できなくなったら終了とする。*/
while (1) {
/*---検索Start---*/
for (row = 1; row < ROW; row++) {
for (col = 1; col < COL; col++) {
if (conf_item[row][col] != 0) {
/*---検索条件@row---*/
for (j = 1; j < COL; j++) {
if (conf_item[row][j] == 0) {
item[row][j][conf_item[row][col]] = 0;
}
}
/*---検索条件@完了---*/
/*---検索条件Acol---*/
for (i = 1; i < ROW; i++) {
if (conf_item[i][col] == 0) {
item[i][col][conf_item[row][col]] = 0;
}
}
/*---検索条件A完了---*/
/*---検索条件Bmatrix---*/
/*どの配列に含まれる数字化判断する*/
if (row <= 3) {
row_matrix = 1;
}
else if (row <= 6) {
row_matrix = 4;
}
else {
row_matrix = 7;
}
if (col <= 3) {
col_matrix = 1;
}
else if (col <= 6) {
col_matrix = 4;
}
else {
col_matrix = 7;
}
/*---配列判断終了---*/
for (i = row_matrix; i < row_matrix + 3; i++) {
for (j = col_matrix; j < col_matrix + 3; j++){
if (conf_item[i][j]==0) {
item[i][j][conf_item[row][col]=0;
}
}
}
/*---検索条件B完了---*/
}
}
}
/*---検索完了---*/
/*---判定Start---*/
conf_num = 0;
change = 0; /*conf_itemに数値が入ったら1とする。0のままでだとbreak。*/
for (row = 1; row < ROW; row++) {
for (col = 1; col < COL; col++) {
/*値が確定していないマスに対して実行する。*/
if (conf_item[row][col] == 0) {
undecide_num = 0;
candidate_num = 0;
for (n = 1; n < N; n++) {
if (item[row][col][n] == 1) {
undecide_num++;
candidate_num = n;/*conf_itemに入る候補の数字を格納*/
}
}
//printf_s("\n");
/*値の更新*/
if (undecide_num == 1) {
conf_item[row][col] = candidate_num;
change++;/*変更があったのでカウントする*/
conf_num++;/*値が確定したのでカウントしておく*/
}
}
/*値が確定しているので数えておく*/
else {
conf_num++;
}
}
}
/*---判定終了---*/
cnt++;
printf_s("\n");
fprintf_s(Output_File, "\n cnt=%d \n", cnt);
for (row = 1; row < ROW; row++) {
for (col = 1; col < COL; col++) {
printf_s("%d,", conf_item[row][col]);
fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
}
printf_s("\n");
fprintf_s(Output_File, "\n");
}
printf_s("\n");
/*終了条件@すべてのマスが確定した*/
if (conf_num == 81) {
printf_s("success\n");
break;
}
/*終了条件A新たに値が確定したマスがなかった*/
if (change == 0) {
printf_s("miss\n");
break;
}
}
fprintf_s(Output_File, "\n result \n");
for (row = 1; row < ROW; row++) {
for (col = 1; col < COL; col++) {
printf_s("%d,", conf_item[row][col]);
fprintf_s(Output_File, "%d,", conf_item[row][col]);/*出力ファイルに入力データを出力*/
}
printf_s("\n");
fprintf_s(Output_File, "\n");
}
/*---File読み込み終わり---*/
fclose(Output_File);
/*--コマンドライン停止用、意味はない--*/
scanf_s("%s", gomi, 100);
}
<<0.考え方
<<1.ファイルの準備
<<2.判定式の作成
>>