return-type queens( arguments )
{
if non-promising
report failure and return;
else if success
report answer and return;
else
visit children recursively;
}
어떤 노드에 있는지를 지정
해야 한다.int[] cols = new int [N+1];
return-type queens(int level)
{
if non-promising
report failure and return;
else ifsuccess
report answer and return;
else
visit children recursively;
}
level
은 현재 노드의 위치를 표현하고, 1번에서 level번째 말이 어디에 놓였는지cols
로 표현하자.cols[i] = j
는 i번 말
이 (i행, j열)에 놓였음
을 의미한다.int[] cols = new int [N+1];
boolean queens( int level )
{
if non-promising
report failure and return;
else ifsuccess
report answer and return;
else
visit children recursively;
}
return-type
은 일단 boolean(true or false)
으로 지정하자성공이냐 실패냐를 반환
한다.int[] cols = new int [N+1];
boolean queens( int level )
{
if (!promising(level))
return false;
else if success
report answer and return;
else
visit children recursively;
}
non-promising
(꽝!)할까? 일단 이 문제는int[] cols = new int [N+1];
boolean queens(int level)
{
if(!promising(level))
return false;
else if (level==N
return true;
else
visit children recursively;
}
level==N
이면 모든 말이 놓였다는 의미이고 따라서 성공이다.int[] cols = new int [N+1];
boolean queens(int level )
{
if(!promising(level))
return false;
else if (level==N)
return true;
for (int i = 1; i <= N; i++) {
cols[level+1] = i;
if (queens(level+1))
return true;
}
return false;
}
level+1번째 말
을 각각의 열에 놓은 후 recursion
을 호출한다.boolean promising(int level)
{
for (int i = 1; i < level; i++) {
if (**cols\[i\] == cols\[level\]**) // 같은 열에 놓였는지 검사
return false;
else **if on the same diagonal** // 같은 대각선에 놓였는지 검사
return false;
}
return true;
}
boolean promising(int level)
{
for (int i = 1; i < level; i++) {
if (cols[i] == cols[level]**)
return false;
else if (level-i == Math.abs(cols[level]-cols[i]) // 같은 대각선에 놓였는지 검사
return false;
}
return true;
}
int [] cols = new int [N+1];
boolean queens( int level )
{
if (!promising(level))
return false;
else if (level == N) {
for (int i = 1; i <= N; i++)
System.out.println("(" + i + ", " + cols[i] + ")");
return true;
}
for (int i = 1; i <= N; i++) {
cols[level+1] = i;
if (queens(level+1))
return true;
}
return false;
}
Reference