9도 OJ 1254: N황후 문제(N황후 문제, 귀속, 거슬러 올라가기)

시간 제한: 1초
메모리 제한: 128메가바이트
특수 판제: 아니요
제출: 765
해결
제목 설명:
N황후 문제, 즉 N*N의 네모난 바둑판 안에 N황후를 놓아서 서로 공격하지 못하게 하는 것이다(즉 임의의 황후 2명은 같은 줄, 같은 열, 같은 사선에 있는 것을 허락하지 않는다. 왜냐하면 황후는 직진, 가로, 옆으로 아래와 같이 갈 수 있기 때문이다).
당신의 임무는 주어진 N에 대해 몇 가지 합법적인 방치 방법을 구하는 것입니다.출력 N황후 문제의 모든 다른 배치 상황 개수.
입력:
여러 그룹의 테스트 데이터를 포함하는 것을 입력하십시오.각 그룹의 테스트 데이터는 정수 n(3출력:
각 그룹의 테스트 데이터에 대해 출력은 모두 다른 배치 상황 개수를 출력하고 결과는 단독 한 줄입니다.
샘플 입력:
4

샘플 출력:
2

생각:
N황후 문제의 일반적인 해법은 탐색 소거법으로 모든 해를 제시할 수 있다.하나만 풀면 된다면, 랜덤 해법도 있다.
일반적인 해법보다 더 효율적인 것은 비트 연산 해법이다.
양자의 상세한 소개는 나의 또 다른 글인 《N황후 문제 알고리즘》을 참조하세요.
코드:
#include <stdio.h>
 
int n, allPlacedState, count;
 
void queen(int row, int ld, int rd)
{
    if (row != allPlacedState)
    {
        int pos = allPlacedState & ~(row | ld | rd);
        while (pos)
        {
            int p = pos & -pos;
            pos -= p;
            queen(row+p, (ld+p)<<1, (rd+p)>>1);
        }
    }
    else
    {
        count ++;
    }
}
 
int main()
{
    while (scanf("%d", &n) != EOF)
    {
        allPlacedState = (1<<n)-1;
        count = 0;
        queen(0, 0, 0);
        printf("%d
", count); } return 0; } /************************************************************** Problem: 1254 User: liangrx06 Language: C Result: Accepted Time:90 ms Memory:912 kb ****************************************************************/

좋은 웹페이지 즐겨찾기