백준 9663 c++

magicdrill·2024년 3월 23일
0

백준 문제풀이

목록 보기
197/654

백준 9663 c++

#include <iostream>

using namespace std;

int* chess_board;
int N, cnt = 0;
int input(int lower, int upper)
{
	//cout << "input()" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

bool check(int num)
{
	//cout << "check()\n";
	int i;

	for (i = 0; i < num; i++)
	{
		if ((chess_board[num] == chess_board[i])
			|| (num - i == chess_board[num] - chess_board[i])
			|| (num - i == -1*(chess_board[num] - chess_board[i])))
		{
			return false;
		}
		else
		{
			;
		}
	}

	return true;
}

//퀸이 서로 공격할 수 없으려면, 같은 열, 같은 행, 대각선에 위치하면 안된다.
void dfs(int num)
{
	//cout << "dfs()\n";
	int i;

	if (N == num)//N개의 퀸을 배치했을 경우
	{
		cnt++;
	}
	else//N개의 퀸을 배치하지 못한 경우
	{
		for (i = 0; i < N; i++)
		{
			chess_board[num] = i;
			if (check(num) == true)
			{
				dfs(num + 1);
			}
			else
			{
				;
			}
		}
	}
	return;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int i;
	
	N = input(1, 15);
	chess_board = new int[N];
	dfs(0);
	cout << cnt << "\n";

	delete[] chess_board;

	return 0;
}

0개의 댓글