n-Queen 모ë�¸ì—�ë�„ ì �ìš© 가능합니다~
초기 구ìƒ� ¶
8bit == 1byte ë�¼ëŠ” ìƒ�ê°�ì�„ í•˜ê³ ë¹„íŠ¸ì—°ì‚°ë§Œìœ¼ë¡œ í• ìˆ˜ 있ì�„것 같다는 ìƒ�ê°�ì�„ 하였다. 하지만 ì�´ 경우는 n-Queen 으로까지 확장하기까지 íž˜ë“¤ê³ ê°„ë‹¨í•œ index 로 ê°’ì�„ ì°¸ì¡°í• ìˆ˜ 있는 ë°°ì—´ì—� 비해 ë¹„ëŠ¥ë¥ ì �ì�¸ 방법ì�´ë‹¤. 단지 ì†�ë�„ê°€ 조금 ë¹ ë¥¼ 것으로 믿었는ë�°.. 빨ë�¼ë´¤ìž� 얼마나 ë¹ ë¥´ê² ì–´.--;
나중ì—�는.. ¶
recursive-call ì�„ ì�´ìš©í•˜ê² 다는 ìƒ�ê°�ì�´ í�¼ëœ© 들었다. ì—시 가장 ë¬¸ì œê°€ ë�˜ëŠ” 부분ì�€ backtrack 하는 부분ì�´ì—ˆë‹¤.
구린ì � ¶
처ì�Œì—� 시작 call ì�„ 좀 ì�´ìƒ�하게 한다. loop ì�„ ë�Œë©´ì„œ 첫번째 ë�¼ì�¸ì�˜ ì›�소ì—� 대한 get_Queen()함수를 호출한다. ìƒ�ê°�ì—�는 get_Queen(0,0); 처럼 호출하는게 가장 ì�´ìƒ�ì �ì�´ë�¼ê³ ìƒ�ê°�하는ë�°..--;
source code ¶
~cpp
#include <iostream.h>
#define QUEEN 8
int Queen[QUEEN][QUEEN]={0};
int total=0;
void print_result();
void reset(int fromline=0);
void get_Queen(int x, int y);
int check(int i, int j);
int main()
{
for(int i=0; i<QUEEN; i++)
{
reset();
get_Queen(i,0);
}
return 0;
}
void get_Queen(int x, int y)
{
reset(y+1);
Queen[x][y]=1;
if(y==QUEEN-1) print_result();
for(int i=0; i<QUEEN; i++)
if(check(i,y+1))
get_Queen(i,y+1);
Queen[x][y]=0;
}
void print_result()
{
int i,j;
for(i=0; i<QUEEN; i++)
{
for(j=0; j<QUEEN; j++)
cout << Queen[j][i] << " ";
cout << endl;
}
cin.get();
}
void reset(int fromline)
{
int i,j;
for(i=0; i<QUEEN; i++)
for(j=fromline; j<QUEEN; j++)
Queen[i][j]=0;
}
int check(int i, int j)
{
if(i<0 || j<0 || i>=QUEEN || j>=QUEEN)
return 0;
int x, y, sum=0;
for(y=j-1; y>=0 && sum==0; y--) /* 위로 */
sum+=Queen[i][y];
for(x=i-1; x>=0 && sum==0; x--) /* 왼쪽으로 */
sum+=Queen[x][j];
for(x=i-1, y=j-1; x>=0 && y>=0 && sum==0; x--, y--) /* 대ê°�ì„ */
sum+=Queen[x][y];
for(x=i+1, y=j-1; x<QUEEN && y>=0 && sum==0; x++, y--) /* 대ê°�ì„ */
sum+=Queen[x][y];
return (int)(sum==0);
}










