퀸즈 2N 블루 브릿지 컵 기본적인 운동
문제 설명
보드 여왕 일부의 위치에 배치 될 수는 n * N 보드 주어. 지금 블랙 보드 배치 N 및 N-퀸즈 화이트 퀸 그래서 두 검정 즈가 동일한 라인 동일한 열 또는 동일한 대각선 상없는 것이 아니라, 동일 행에있는 두 개의 흰색 퀸 동일한 열 또는 동일한 대각선. Q. A는 얼마나 많은 넣어 법의 총? N은 8 이하이다.
입력 포맷
입력은 제 정수 n, 기판의 크기가 작용한다.
A는 퀸 수없는 방출에 대응하는 위치를 나타내는 0의 정수이면이어서 N 행의 각 행 n은 0 또는 1의 정수이고, A는 퀸에 대응하는 위치를 나타내는 정수 1 인 경우, 배치 할 수있다.
출력 형식
출력은 종의 총 수를 나타내는 정수는 법을했습니다.
샘플 입력 :
(4)
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
샘플 출력 :
2
샘플 입력 :
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
샘플 출력 :
0
솔루션의 개요
이 문제를 해결하기 전에, 필요 이해의 n 여왕 문제는, 이하 블로그 수있는 참조
N 퀸즈
다음 질문은 주요 개념에 대해 설명
여왕 왕비 문제는 2N이 문제를 퀸즈, 필요가있다, 그이다 N 사이 2N 주요 차이점을 상기 퀸과 다른 색을 넣어가 바이 패스 위치에 배치 된 후에 배치 한 컬러 기록 퀸의 배치.
I는 표시 위치를 기록하는 깊이 우선 탐색 방법에있어서, 제 퀸 흑색 표시를 사용하여 [J]가 [I]는 구경을 배열 블랙 퀸 배치 1 (난, J 크로스 좌표 임)로 설정 빠졌을, 화이트 퀸, 같은 원리를 배치 시작 단에 위치 할 때되도록 매장에서 [I]가 [J] == 0이 될 수있다.
특정 코드는 다음과
코드 (C ++)
#include<iostream>
#include<cmath>
#define maxsize 8
using namespace std;
int n;
int num=0;//输出结果 符合条件的摆法
int res_b[maxsize]; //符合条件的黑皇后摆放序列
int res_w[maxsize];//符合条件的白皇后摆放序列
int map[maxsize][maxsize];
int visit[maxsize][maxsize];//记录
int dfs_white(int step);
int dfs_black(int step);
bool check_b(int step);
bool check_w(int step);
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>map[i][j];
visit[i][j]=0;
}
dfs_black(1);
cout<<num;
return 0;
}
int dfs_white(int step)
{
if(step==n+1)//白皇后全部摆放完成
{
num++;
}
for(int i=0;i<n;i++)
{
if(!map[i][step-1]||visit[i][step-1]==1) //是否能存放皇后
continue;
res_w[step-1]=i;
if(check_w(step))
{
visit[i][step-1]=1;
dfs_white(step+1);
visit[i][step-1]=0;
}
}
}
int dfs_black(int step)
{
if(step==n+1)
{
dfs_white(1);//黑皇后全部摆放完成,开始统计白皇后
}
for(int i=0;i<n;i++)
{
if(!map[i][step-1]) //是否能存放皇后
continue;
res_b[step-1]=i;
if(check_b(step))
{
visit[i][step-1]=1;
dfs_black(step+1);
visit[i][step-1]=0;
}
}
}
bool check_b(int step)
{
for(int i=0;i<step-1;i++)
{
if(res_b[i]==res_b[step-1]||abs(step-1-i)==abs(res_b[step-1]-res_b[i])) //保证摆放的位置之前没有出现过 和不在对角线上
return false;
}
return true;
}
bool check_w(int step)
{
for(int i=0;i<step-1;i++)
{
if(res_w[i]==res_w[step-1]||abs(step-1-i)==abs(res_w[step-1]-res_w[i]))//保证摆放的位置之前没有出现过 和不在对角线上
return false;
}
return true;
}
(OJ의 블루 브릿지 컵 구덩이, 여섯 번째 포인트가 I하지하지만 2406에 의해 내 출력 권리가)
문제가, 그냥 블로그를 쓰기 시작하십시오 조언