반응형
반응형

https://www.acmicpc.net/problem/9663

문제 요약

퀸 N개를 서로 공격할 수 없게 놓는 경우의 수 출력하기

 

 

 

참고

https://youtu.be/gcuZ_VGIcn4?si=96vY5Q1qLXZ-O1cl

처음에 이해할 때 도움이 많이 된 영상

 

 

 

풀이(백트래킹)
int n=int.Parse(Console.ReadLine()),r=0,c=0;
//r : 현재까지 퀸을 배치한 행 번호
//c : 퀸을 올바르게 배치한 경우의 수
var q=new int[n]; //q : 각 행마다 퀸을 배치한 열 번호(q[0]=3 -> 0행 3열)

while(true){
    if(r==n) //퀸을 성공적으로 배치했을 때
    {
        c++; //경우의 수+1
        q[--r]++; //이전 행의 다음 열에도 가능한 경우의 수가 있는지 찾기
    }
    else if(q[r]==n) //현재 케이스를 끝까지 다 둘러본 경우(다음 케이스로 넘어갈 준비)
    {
        q[r]=0;
        if(--r<0)break;
        q[r]++; //다음 케이스 시도
    }
    else //검사중
    {
        int d=1;
        for(int i=0;i<r;i++)
            if (q[i]==q[r]||Math.Abs(q[i]-q[r])==r-i){d=0;break;} 
            //퀸이 같은 열 또는 대각선에 있을 때 d=0으로 바꾸고 탐색 중단
            //q[i] == q[r] : 같은 열에 있는지 비교
            //Math.Abs(q[i]-q[r]) == r-i : 대각선에 있는지 비교
            //하나라도 충돌하면 d=0으로 변경하고 for문 탈출
        if(d==1)r++;
        //같은 열이나 대각선에 없으면 r++ 해서 다시 while문 순회
        else q[r]++;
        //d가 1이 아닐 경우 q[r]++(현재 행에서 다음 열로 한칸 이동해서 다른 경우의 수 탐색)
    }

}
Console.Write(c);

※ 여기서 말하는 "케이스" : 첫 번째 퀸을 (0, i)에 놓았을 때의 경우의 수

 

 

 

숏코딩
더보기
Console.Write(new[]{0,1,0,0,2,10,4,40,92,352,724,2680,14200,73712,365596}[int.Parse(Console.ReadLine())]);

n이 15까지니까 모든 경우의 수 배열로 만들고 고대로 출력하기


머리로는 이해되는데 코딩하는 게 너무 어려움... 그리고 이제 풀어야 되는 문제들이 다 이 정도 수준이겠지 울고 싶다 진짜

반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[C#]백준 12865 평범한 배낭 - Hide  (0) 2025.07.04
[C#]백준 15686 치킨 배달 - Hide  (0) 2025.07.03
[C#]백준 10026 적록색약  (0) 2025.06.29
[C#]백준 7576 토마토  (0) 2025.06.28
[C#]백준 2667 단지번호붙이기  (0) 2025.06.27

+ Recent posts