CTRL + N  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
스도쿠(sudoku) _ 02. Naked Single 구현

스도쿠 과제의 두번째.
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);

int main() {
 
 Cell sudoku[9][9];
 
 SetCell(sudoku);
 Check(sudoku);
 example(sudoku);
 Check(sudoku);
 Candidate(sudoku);
 // PrintCell(sudoku);
 cout << endl<< endl<< endl<<"/////////////////  NakedSingle 후  /////////////////" << endl << endl << endl;
 NakedSingle(sudoku);
 Check(sudoku);
 // All(sudoku);
 
 return 0;
}

void SetCell(Cell sudoku[][9]) {
 for(int i = 0; i < 9; i++) {
  for(int j = 0; j < 9; j++) {
   sudoku[i][j].count = 9;
   sudoku[i][j].value = 0;
   for(int k = 0; k < 9; k++) {
    sudoku[i][j].candidate.push_back(k+1);
   }
  }
 }
}

void PrintCell(Cell sudoku[][9]) {
 while(1) {
  int row, col;
  cout << "출력할 Row => ";
  cin >> row;
  if(row == -1)
   break;
  cout << "출력할 Column => ";
  cin >> col;
 
  cout << row << "번째 행 " << col << "번째 열 => ";
  for(int k = 0; k < sudoku[row][col].count; k++) {
   int temp = sudoku[row][col].candidate.front();
   cout << sudoku[row][col].candidate.front() << " | "; //candidate값 출력
   sudoku[row][col].candidate.push_back(temp); //삭제 전 뒤에 삽입
   sudoku[row][col].candidate.pop_front(); //candidate값 삭제
  }
  cout << endl << "Count = > " << sudoku[row][col].count << endl;
 }
}

void InsertData(Cell sudoku[][9]) {
 int row, col, data;
 while(row != 0) {
  cout << "삽입할 Row / Column / Data 종료는 0 0 0 => ";
  cin >> row >> col >> data;
  /*
  cout << "삽입할 Column => ";
  cin >> col;
  cout << "삽입할 숫자 => ";
  cin >> data;
  */
 
  sudoku[row-1][col-1].value = data; // Data를 Cell에 입력
 }
}

void All(Cell sudoku[][9]) {
 for(int i = 0; i < 9; i++) {
  for(int j = 0; j < 9; j++) {
   cout << "=== " << i << " by " << j << " data " << " ===" ;
   for(int k = 0; k < sudoku[i][j].count; k++) {
    int temp = sudoku[i][j].candidate.front();
    cout << sudoku[i][j].candidate.front() << " ";
    sudoku[i][j].candidate.push_back(temp); //삭제 전 뒤에 삽입
    sudoku[i][j].candidate.pop_front(); //candidate값 삭제
   }
   cout << endl;
  }
 }
}
void Check(Cell sudoku[][9]) {
 for(int i = 0; i < 9; i++) {
  for(int j = 0; j < 9; j++) {
   cout << sudoku[i][j].value << " " ;
   if(j%3 == 2)
    cout << " ";
  }
  cout << endl;
  if(i%3 == 2)
   cout << endl;
 }
}


void NakedSingle(Cell sudoku[][9]) {
 for(int i = 0; i < 9; i++) {
  for(int j = 0; j < 9; j++) {
   if(sudoku[i][j].count == 1) {
    sudoku[i][j].value = sudoku[i][j].candidate.front();
    sudoku[i][j].count--;
    Candidate(sudoku);
   }
  }
 }
}

void example(Cell sudoku[][9]) {
 sudoku[0][0].value = 1;
 sudoku[0][1].value = 4;
 sudoku[0][2].value = 9;
 sudoku[0][4].value = 3;
 sudoku[0][5].value = 2;
 sudoku[0][6].value = 7;
 sudoku[0][7].value = 6;
 sudoku[1][0].value = 3;
 sudoku[1][1].value = 8;
 sudoku[1][3].value = 7;
 sudoku[1][4].value = 5;
 sudoku[1][5].value = 6;
 sudoku[1][6].value = 4;
 sudoku[2][0].value = 5;
 sudoku[2][4].value = 1;
 sudoku[2][5].value = 9;
 sudoku[2][6].value = 3;
 sudoku[2][7].value = 2;
 sudoku[3][1].value = 3;
 sudoku[3][3].value = 5;
 sudoku[3][4].value = 4;
 sudoku[3][5].value = 1;
 sudoku[3][6].value = 2;
 sudoku[3][8].value = 6;
 sudoku[4][0].value = 6;
 sudoku[4][1].value = 5;
 sudoku[4][2].value = 1;
 sudoku[4][3].value = 2;
 sudoku[4][4].value = 7;
 sudoku[4][5].value = 8;
 sudoku[4][6].value = 9;
 sudoku[5][0].value = 4;
 sudoku[5][1].value = 2;
 sudoku[5][2].value = 8;
 sudoku[5][3].value = 9;
 sudoku[5][4].value = 6;
 sudoku[5][6].value = 5;
 sudoku[5][7].value = 7;
 sudoku[5][8].value = 1;
 sudoku[6][0].value = 7;
 sudoku[6][1].value = 6;
 sudoku[6][2].value = 3;
 sudoku[6][3].value = 1;
 sudoku[6][4].value = 9;
 sudoku[6][5].value = 5;
 sudoku[6][7].value = 4;
 sudoku[6][8].value = 2;
 sudoku[7][0].value = 8;
 sudoku[7][2].value = 4;
 sudoku[7][5].value = 7;
 sudoku[7][6].value = 1;
 sudoku[7][8].value = 3;
 sudoku[8][3].value = 3;
 sudoku[8][5].value = 4;
 sudoku[8][6].value = 6;
 sudoku[8][7].value = 9;
}

void Candidate(Cell sudoku[][9]) {
 
 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;
    }
   
    //==================Box Candidate값 삭제==================//
    for(i = r_min; i <= r_max; i++) {
     for(int j = c_min; j <= c_max; j++) {
      if( FindCand(sudoku, i, j, data) == 1) {
       sudoku[i][j].candidate.remove(data);
       sudoku[i][j].count--;
      }
     }
    }
    //========================Box Candidate값 삭제 처리 끝==============//
   
    //Row Line Candidate값 삭제
    for(i = 0; i < 9; i++) {
     if(FindCand(sudoku, i, col, data) == 1) {
      sudoku[i][col].candidate.remove(data);
      sudoku[i][col].count--;
     }
    }
   
    //Column Line Candidate값 삭제
    for(i = 0; i < 9; i++) {
     if(FindCand(sudoku, row, i, data) == 1) {
      sudoku[row][i].candidate.remove(data);
      sudoku[row][i].count--;
     }
    }
   }
  }
 }
}
int FindCand(Cell sudoku[][9], int row, int col, int data) {
 int check = 0;
 for(int k = 0; k < sudoku[row][col].count; k++) {
  int temp = sudoku[row][col].candidate.front();
  if( temp == data ) {
   check = 1;
  }
  sudoku[row][col].candidate.push_back(temp); //삭제 전 뒤에 삽입
  sudoku[row][col].candidate.pop_front(); //candidate값 삭제
 }
 return check;
}

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Tag : , , ,


BLOG main image
void
 Notice
 Category
분류 전체보기 (38)
할말있어 (14)
보고싶어 (12)
다시볼래 (3)
봐야할거 (1)
앨고리듬 (8)
 TAGS
영화 롯데시네마 미국 미트릭스 올림픽 코니카 HY-CoRA 유치원 meatrix 그만좀 사진 linked list Hey there delilah 매그넘 쿵푸팬더 데이터구조론 스도쿠 konica 아이 카메라 미슈퍼 애니메이션 기타 c++ 뽀에버-_ Plain White T's 고기 ME Super AF 헥사 의미부여 Pentax 패스트푸드 Naked Single 코리아 운동회 가을 hexar 육식 펜탁스
 Calendar
«   2009/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
 Recent Entries
스도쿠(sudoku) _ 02. Naked Single 구현
스도쿠(sudoku) _ 01. Candidated data
All about Konica HEXAR AF Black
동방신기와 비의 선정적 가사 논란?
굿바이 미슈퍼 (2)
疼感
다시보는 MAGNUM KOREA展
충동적인 카테고리 생성 -_-; (1)
어느 유치원의 가을 운동회-   by. Pent.. (3)
Linked List_4 -Remove
 Recent Comments
하익호 압둘라님 과..
imPs - 2008
사진도 참 좋고(마음..
압둘라 - 2008
싸이가 점검 중인가..
오리 - 2008
어떻게 보면 그럴수..
imPs - 2008
그건 그렇고 사진이..
오리 - 2008
미성년 노동 착취군요
오리 - 2008
http://kr.nvidia.co..
dd - 2008
88년 간지
imPs - 2008
다들 빅파이를 눈에..
xenolith - 2008
[비밀댓글]
- 2008
 Recent Trackbacks
유치원 가을운동회 -..
하지모의 무지개 내..
실타래 테스트 페이..
sealtale in %g
누군가 이 사람들 입..
:::Cat On A Baobab..
 Archive
2008/11
2008/10
2008/09
2008/08
2008/07
 Link Site
Brit Awards
Im@ge Press
jphole
MAGNUM KOREA
MUTANSAN BLOG
UGLYblog.net
고재열의 독설닷컴
찜질방
한국HCI연구회
흑포현상소
 Visitor Statistics
Total : 6,251
Today : 0
Yesterday : 1
rss