728x90
backtracking
: 퇴각검색
: 한정 조건을 가진 문제를 푸는 전략
: 조합탐색과 연관
백트래킹 단계
삼성 SW 역량 테스트 기출 문제 1
www.acmicpc.net
● [문제번호 15649] N과 M(1)
#include <iostream>
using namespace std;
int N, M;
int num[9] = {0, }; // 초기화 하면 4ms 실행시간 감소
bool visited[9] = {0, };
void dfs(int cnt)
{
if(cnt == M)
{
for(int i = 0; i < M; i++)
cout << num[i] << ' ';
cout << '\n'; // endl 사용시 시간 초과 판정
return ;
}
for(int i = 1; i <= N; i++)
{
if(!visited[i])
{
visited[i] = true;
num[cnt] = i;
dfs(cnt + 1);
visited[i] = false;
}
}
}
int main()
{
cin >> N >> M;
dfs(0);
return 0;
}
● [문제번호 15650] N과 M(2)
#include <iostream>
using namespace std;
int N, M;
int num[9] = {0, }; // 초기화 하면 4ms 실행시간 감소
bool visited[9] = {0, };
void dfs(int cnt, int cnt_num)
{
if(cnt == M)
{
for(int i = 0; i < M; i++)
cout << num[i] << ' ';
cout << '\n'; // endl 사용시 시간 초과 판정
return ;
}
for(int i = cnt_num; i <= N; i++)
{
if(!visited[i])
{
visited[i] = true;
num[cnt] = i;
dfs(cnt + 1, i + 1);
visited[i] = false;
}
}
}
int main()
{
cin >> N >> M;
dfs(0, 1);
return 0;
}
● [문제번호 15651] N과 M(3)
#include <iostream>
using namespace std;
int N, M;
int num[9] = {0, }; // 초기화 하면 4ms 실행시간 감소
void dfs(int cnt)
{
if(cnt == M)
{
for(int i = 0; i < M; i++)
cout << num[i] << ' ';
cout << '\n'; // endl 사용시 시간 초과 판정
return ;
}
for(int i = 1; i <= N; i++)
{
num[cnt] = i;
dfs(cnt + 1);
}
}
int main()
{
cin >> N >> M;
dfs(0);
return 0;
}
● [문제번호 15652] N과 M(4)
#include <iostream>
using namespace std;
int N, M;
int num[9] = {0, }; // 초기화 하면 4ms 실행시간 감소
void dfs(int cnt, int cnt_num)
{
if(cnt == M)
{
for(int i = 0; i < M; i++)
cout << num[i] << ' ';
cout << '\n'; // endl 사용시 시간 초과 판정
return ;
}
for(int i = cnt_num; i <= N; i++)
{
num[cnt] = i;
dfs(cnt + 1, i);
}
}
int main()
{
cin >> N >> M;
dfs(0, 1);
return 0;
}
● [문제번호 9663] N-Queen
#include <iostream>
using namespace std;
int N, result;
int num[15];
// 배열의 value : 행
// 배열의 index : 열
bool check(int col)
{
for(int i = 0; i < col; i++)
{ // 다른 열이니 열 비교 X
if(num[col] == num[i]) // 행 비교
return false;
else if(col - i == abs(num[col] - num[i])) // 대각선 비교
return false;
}
return true;
}
void dfs(int col)
{
if(col == N)
result++;
else
{
for(int row = 0; row < N; row++)
{
num[col] = row;
if(check(col))
dfs(col + 1);
}
}
}
int main()
{
cin >> N;
dfs(0);
cout << result;
return 0;
}
● [문제번호 2580] 스도쿠
● [문제번호 14888] 연산자 끼워넣기
● [문제번호 14889] 스타트와 링크
728x90
'Baekjoon > 단계별로 풀어보기' 카테고리의 다른 글
[단계12] 정렬 (9문제) (0) | 2021.01.14 |
---|---|
[단계11] 부르트 포스 (5문제) (0) | 2021.01.13 |
[단계10] 재귀 (4문제) (0) | 2021.01.12 |
[단계09] 기본 수학2 (11문제) (0) | 2021.01.09 |
[단계08] 기본 수학1 (9문제) (0) | 2020.12.20 |
[단계07] 문자열 (10문제) (0) | 2020.12.20 |
[단계06] 함수 (3문제) (0) | 2020.12.18 |
댓글