퀸즈 2N 블루 브릿지 컵 기본적인 운동

퀸즈 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에 의해 내 출력 권리가)
문제가, 그냥 블로그를 쓰기 시작하십시오 조언

출시 팔 개 원래 기사 · 원의 칭찬 0 · 조회수 709

추천

출처blog.csdn.net/Daturasee/article/details/104784543