< 문제 >
< 해법 >
위 문제를 푸는 전략은 기울기를 이용하는 것입니다. N=8일 때의 예를 보겠습니다.
체스판에 위와같이 좌표를 대입합니다. 즉, Q는 (4,3)에 위치하고 있습니다.
그러면 Q가 영향을 줄 수 있는 조건은 다음과 같습니다.
Q와 다른 말인 x의 x좌표나 y좌표가 같을 때나
Q와 다른 말인 x간의 기울기가 ±1일 때입니다.
< 소스 >
체스에서 Queen은 가로, 세로, 대각선 방향으로 어느 곳이나 한 번에 움직일 수 있습니다.
위 표에서 Q에 Queen이 있을 때 x가 Queen이 이동할 수 있는 곳입니다.
N을 입력했을 때, N*N 크기의 체스판에 N개의 Queen을 놓을 때 Queen들이 서로 영향을 줄 수 없는 경우의 수를 출력하는 문제입니다.
N=4일 때 가능한 모든 예를 보겠습니다.
▶입력형식 (nqueen.in)
N (1≤N≤13)
▶출력형식 (nqueen.out)
N*N의 체스판에서 N개의 Queen들이 서로 영향을 주지 않는 위치로 놓는 방법의 수
▶입력 예
4
▶출력 예
2
| x | x | ||||||
| x | x | x | |||||
| x | x | x | |||||
| x | x | x | |||||
| x | x |
x | x | Q | x | x | x |
| x | x | x | |||||
| x | x | x | |||||
| x | x | x |
N을 입력했을 때, N*N 크기의 체스판에 N개의 Queen을 놓을 때 Queen들이 서로 영향을 줄 수 없는 경우의 수를 출력하는 문제입니다.
N=4일 때 가능한 모든 예를 보겠습니다.
| Q | |||
| Q | |||
| Q | |||
| Q |
| Q | |||
| Q | |||
| Q | |||
| Q |
▶입력형식 (nqueen.in)
N (1≤N≤13)
▶출력형식 (nqueen.out)
N*N의 체스판에서 N개의 Queen들이 서로 영향을 주지 않는 위치로 놓는 방법의 수
▶입력 예
4
▶출력 예
2
< 해법 >
위 문제를 푸는 전략은 기울기를 이용하는 것입니다. N=8일 때의 예를 보겠습니다.
그러면 Q가 영향을 줄 수 있는 조건은 다음과 같습니다.
< 소스 >
#include <fstream.h>
ofstream out ("nqueen.out");
ifstream in ("nqueen.in");
int n,num=0,map[13];
void find(int x);
int promising(int x);
void main(){
in>>n;
int i;
for(i=0;i<n;i++){
map[0]=i;
find(0);
}
out<<num;
}
void find(int x){
int i;
x++;
for(i=0;i<n;i++){
map[x]=i;
if(promising(x)){
if(x==n-1) num++;
else find(x);
}
}
}
int promising(int x){
int i;
for(i=0;i<x;i++){
if(map[x]==map[i]||map[x]-map[i]==x-i||map[x]-map[i]==i-x) return 0;
}
return 1;
}
ofstream out ("nqueen.out");
ifstream in ("nqueen.in");
int n,num=0,map[13];
void find(int x);
int promising(int x);
void main(){
in>>n;
int i;
for(i=0;i<n;i++){
map[0]=i;
find(0);
}
out<<num;
}
void find(int x){
int i;
x++;
for(i=0;i<n;i++){
map[x]=i;
if(promising(x)){
if(x==n-1) num++;
else find(x);
}
}
}
int promising(int x){
int i;
for(i=0;i<x;i++){
if(map[x]==map[i]||map[x]-map[i]==x-i||map[x]-map[i]==i-x) return 0;
}
return 1;
}
'컴퓨터' 카테고리의 다른 글
| 미흡한 네이버 블로그의 도메인 설정 기능 (4) | 2009/02/11 |
|---|---|
| [C] nQueen problem .. backtracking (14) | 2009/01/27 |
| #2. Windows XP - 저성능 컴퓨터를 쓸만하게 만들기 (0) | 2008/09/10 |
| 부팅속도 최적화, 인터넷 보고 무조건 따라하지 마세요. (8) | 2008/08/16 |

댓글을 달아 주세요
참 별게 다 있어요 ㅇㅅㅇ.
저 문제에 기울기가 적용됩니다(...)
컴퓨터 하려 해도 수학을 잘 해야되요 -_-a
ofstream out
ifstream in
<< , >>
주석 도입이 시급합니다.
ofstream 함수이름 ("출력파일경로");
ofstream : 파일 출력 함수.
함수이름 : 출력파일로 출력하는 함수의 이름을 임의로 지정.
설명하자면
ofstream out ("output.txt"); 를 쓴 다음부터는
out << 출력할 내용;
을 쓰면 output.txt로 출력이 되는거야.
애시당초 프로그래밍을 모르기 때문에...
컴퓨터의 세계는 참으로 신비스럽고도 오묘합니다.
저건 귀찮음
미과 '난 해탈했다' 파문
뭥미.. 알고리즘?
네
체스는 아는데 프로그래밍을 모르겠다OTL..
나도 컴퓨터 그래픽말고도 좀 배워보고 싶은데...
독학한거야? 그렇다면 무서운걸..ㄷㄷㄷㄷ
학원 3개월 다녔어요.
좋은 코드 감사합니다!
넵, 댓글 감사합니다. ^^