스도쿠 과제의 두번째. Naked Single 구현하기 Naked Single이란 각 셀의 후보수가 하나일 때를 말한다. 후보수가 하나이므로 곧 그 후보수가 답이므로 노출되있다는 뜻에서 Naked Single이란 표현을 함. 그런경우가 두 개일 땐 Naked Double.
기존의 소스에 Naked Single과 Candidate, FindCand라는 함수를 추가했다. Candidate의 경우 첫번째 코드에선 InsertData에 포함되있던 내용인데 InsertData함수로 셀을 채워나가는게 노가다라고 판단-_- example함수에 문제 한개를 넣어놓고 Candidate함수를 따로 분리해서 Insert하지 않아도 Candidate될수 있게 구현하였다. FindCand함수는 Check변수의 부족함을 느껴 변수를 아예 제거하고 FindCand라는 함수를 추가해 Data의 삭제 여부를 알 수 있게 하였다. 그리고 Naked Single함수의 경우 말그대로 Naked Single을 구현해놓았음.
#include <iostream> #include <list>
using namespace std;
struct Cell { int value; int count; list<int> candidate; };
void SetCell(Cell sudoku[][9]); void PrintCell(Cell sudoku[][9]); void InsertData(Cell sudoku[][9]); void All(Cell sudoku[][9]); void Check(Cell sudoku[][9]); void NakedSingle(Cell sudoku[][9]); void example(Cell sudoku[][9]); void Candidate(Cell sudoku[][9]); int FindCand(Cell sudoku[][9], int row, int col, int data);
for(int row = 0; row < 9; row++) { for(int col = 0; col < 9; col++) {
if(sudoku[row][col].value) { int data = sudoku[row][col].value; int count = sudoku[row][col].count; //==================Candidate값 삭제(해당 Cell)==================// for(int i = 0; i < count; i++) { sudoku[row][col].candidate.pop_front(); sudoku[row][col].count--; }
//==========================Box Candidate값 삭제=========================// int temp = 0, r_min = 0, r_max = 0, c_min = 0, c_max = 0; // 변수 선언 //===================Row 범위 계산==================// temp = row%3; switch(temp) { case 0 : r_min = row; r_max = row + 2; break; case 1: r_min = row - 1; r_max = row + 1; break; case 2: r_min = row - 2; r_max = row; break; } //==================Col 범위 계산==================// temp = col%3; switch(temp) { case 0 : c_min = col; c_max = col + 2; break; case 1: c_min = col - 1; c_max = col + 1; break; case 2: c_min = col - 2; c_max = col; break; }