1-3で書いた①~③の判定を組み込みます。
①同じ行には同じ数字が入らない
②同じ列には同じ数字が入らない
③3×3のマス(Ⅰ~Ⅸ)内に同じ数字が入らない
各マス(row,col)を確認。
(row,col)にn(0以外の数字)が入っていたら。
conf_item!=0;
↓
①同じ行のマスの候補からnを外す。
item[row][1~9][n]=0;
②同じ列のマスの候補からnを外す。
item[1~9][col][n]=0;
③該当する3×3のマス内からnを外す。
どの3×3のマスに入っているかは判定式を作成する。
行、列から下のように場合分けを行う。
row1~3→i=1
row4~6→i=4
row7~9→i=7
col1~3→j=1
col4~6→j=4
col7~9→j=7
そして3×3のマスの候補からnを外す。
item[i~i+3][j~j+3][n]=0;
これによって数字が入っていないマスに入る候補を削っていきます。候補が1つの数字だけになったら確定conf_itemに入れていけば簡単なナンプレ問題は解くことができます。
途中まで以下にソースコードを載せます。このままでは無限ループから抜け出せないので次回にある程度問題が解けるまでにしたいと思います。
-------------------
#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];
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;
}
}
/*---検索条件①完了---*/
/*---検索条件②col---*/
for (i = 1; i < ROW; i++) {
if (conf_item[i][col] == 0) {
item[i][col][conf_item[row][col]] = 0;
}
}
/*---検索条件②完了---*/
/*---検索条件③matrix---*/
/*どの配列に含まれる数字化判断する*/
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;
}
}
}
/*---検索条件③完了---*/
}
}
}
}
/*---検索完了---*/
/*---File読み込み終わり---*/
fclose(Output_File);
/*--コマンドライン停止用、意味はない--*/
scanf_s("%s", gomi, 100);
}