------------------------0730-재귀함수
*
* ------------------체스판 코드 확인하기
#include <iostream>
using namespace std;
char path[10];
char name[5] = "ABCD";
int input;
int s = 0;
char used[4];
void abc(int level) {
if (level == input) {
s++;
return;
}
for (int i = 0; i < input; i++) {
if (used[i] == 1) continue;
used[i] = 1;
path[level] = name[i];
abc(level + 1);
path[level] = 0;
used[i] = 0;
}
}
int main() {
cin >> input;
abc(0);
cout << s;
return 0;
}
*
*
* //이웃해서 같은카드 받지않는 소스 AAA(x) ABA(o)
#include<iostream>
using namespace std;
char path[10];
void abc(int level) {
if (level>=2 && path[level - 1] == path[level - 2]) return; //2번방법
if (level == 3) {
cout << path << endl;
return;
}
for (int i = 0; i < 4; i++) {
//if (level>0 && path[level - 1] != i + 'A')) { //1번방법
path[level] = i + 'A';
abc(level + 1);
path[level] = 0;
//}
}
}
int main()
{
abc(0);
return 0;
}
*
*
//B가 들어가는 경우 모두 제외
//1 진입하지 않는경우 2 진입했다가 return
#include<iostream>
using namespace std;
char path[10];
void abc(int level) {
if (level>0 && path[level - 1] == 'B') return; //2번방법
if (level == 3) {
cout << path << endl;
return;
}
for (int i = 0; i < 4; i++) {
//if (!(i + 'A' == 'B')) { //1번방법
path[level] = i + 'A';
abc(level + 1);
path[level] = 0;
//}
}
}
int main()
{
abc(0);
return 0;
}
*
//C로 시작하는 경우 제외
//1 진입하지 않는경우 2 진입했다가 return
#include<iostream>
using namespace std;
char path[10];
void abc(int level) {
//if (path[0] == 'C') return; //2번방법
if (level == 3) {
cout << path << endl;
return;
}
for (int i = 0; i < 4; i++) {
//if (!(level == 0 && i + 'A' == 'C')) { //1번방법
path[level] = i + 'A';
abc(level + 1);
path[level] = 0;
//}
}
}
* -------카드3장뽑기 중복제외 순열
#include<iostream>
using namespace std;
char path[10];
int used[4]; // A B C D 사용됐는지 확인
void abc(int level) {
if (level == 3) {
cout << path << endl;
return;
}
for (int i = 0; i < 4; i++) {
if (used[i] == 1) continue; //다음 반복 실행
used[i] = 1;
path[level] = i+ 'A';
abc(level + 1);
path[level] = 0;
used[i] = 0;//출력된 경우 다시 초기화
}
}
int main()
{
abc(0);
return 0;
}
* ------------------5개배열에 OX출력하는 모든 경우의수
//lv :5, br : 2
#include<iostream>
using namespace std;
int n[5] = { 0 };
char path[10];
char name[3] = "OX";
void abc(int level) {
if (level == 5) {
cout << path << endl;
return;
}
for (int x = 0; x < 2; x++) {
path[level] = name[x];
abc(level + 1);
path[level] = 0;
//path[level] = 0;
}
}
int main()
{
abc(0);
return 0;
}
*
* -------------------주사위 n개 돌렸을때 나올수있는 모든 경우의수
//lv :n, br : 6
#include<iostream>
using namespace std;
int n;
char path[7];
void abc(int level) {
if (level == n) {
cout << path <<endl;
return;
}
for (int x = 0; x < 6; x++) {
path[level] = '1' + x;
abc(level + 1);
//path[level] = 0;
}
}
int main()
{
cin >> n;
abc(0);
return 0;
}
*
* -----------------ABCD카드더미에서 3가지글자조합 모든경우의수 출력
#include<iostream>
using namespace std;
char path[5];
void abc(int level) {
if (level == 3) {
cout << path <<endl;
return;
}
for (int x = 0; x < 4; x++) {
path[level] = 'A' + x;
abc(level + 1);
path[level] = 0;
}
}
int main()
{
abc(0);
return 0;
}
*
* -------------트리의 가장 하위레벨 출력하기
#include<iostream>
using namespace std;
int path[10];
void abc(int level) {
if (level == 2) {
for (int x = 0; x < level; x++) {
cout << path[x] << " ";
}
cout << endl;
return;
}
for (int x = 0; x < 3; x++) {
path[level] = x + 1;
abc(level + 1);
path[level] = 0;
}
}
int main()
{
abc(0);
return 0;
}
*
*
* 문자열에 사용된 알파벳 알아보기(중복출력x dat문)
* #include<iostream>
using namespace std;
int de;
int main()
{
char vect[9] = "ABCQADBC";
int flag[100] = { 0 };
for (int i = 0; i < 8; i++) {
int val = vect[i];
flag[val] = 1;
}
for (char target = 'A'; target <= 'Z'; target++) {
if (flag[target] == 1)
cout << target;
}
return 0;
}
* -------------------문자열에 사용된 알파벳 알아보기(중복출력x 이중for문)
* #include<iostream>
using namespace std;
int de;
int main()
{
char arr[9] = "ABCQADBC";
char s[8];
for (char target = 'A'; target <= 'Z'; target++) {
int flag = 0;
for (int i = 0; i < 8; i++) {
if (arr[i] == target) {
flag = 1;
}
}
if (flag == 1)cout << target;
}
return 0;
}
*
* ---------------------------배열에 1~9까지 각각 몇개있는지(dat이용)
* #include<iostream>
using namespace std;
// dat이용하기 cnt 변수를 여러개 만들었음
int de;
int arr[8] = { 3,2,1,2,5,3,2,1 }; // 수 0~9
int main()
{
int cnt[10] = { 0 }; // cnt 변수 10개
for (int i = 0; i < 8; i++) {
int val = arr[i];
cnt[val] ++; // counting 3 2 1 2 5 3 2 1
}
for (int val = 0; val < 10; val++) {
if (cnt[val] != 0) {
cout << val << " : " << cnt[val] << endl;
}
}
return 0;
}
*
* ---------------------------배열에 1~9까지 각각 몇개있는지(2중for문)
* #include <iostream>
using namespace std;
int arr[] = { 3,2,1,2,5,3,2,9 };
int main() {
int c[10] = { 0 };
for (int target = 0; target < 10; target++) {
int cnt = 0;
for (int i = 0; i < 8; i++) {
if (arr[i] == target) cnt++;
}
if (cnt != 0)
cout << target << " : " << cnt << "개" << "\n";
}
return 0;
}
*
* ----------원하는 순서로 출력하기
#include <iostream>
using namespace std;
int arr[7] = { 3,7,5,9,8,7 };
int order[6] = { 2,3,1,5,-1,4 };
void run(int now) {
cout << arr[now] << " ";
if (order[now] == -1) {
return;
}
run(order[now]);
return;
}
int main() {
run(0);
return 0;
}
*
*
#include <iostream>
using namespace std;
void abc(int level) {
if (level == 2) {
return;
}
//abc(level +1);
//abc(level +1);
for (int i = 0; i < 2; i++) {
abc(level + 1);
}
int d = 1;
}
int main() {
abc(0);
return 0;
}
*
*
#include <iostream>
using namespace std;
int n[] = {4,7,9,1,5};
void abc(int x) {
cout << n[x]<<" ";
if (x == 4) {
return;
}
abc(x + 1);
cout << n[x] << " ";
int d = 1;
}
int main() {
abc(0);
return 0;
}
*
*
#include <iostream>
using namespace std;
int n;
void abc(int x) {
cout << x<<" ";
if (x == 1) {
return;
}
abc(x - 1);
cout << x << " ";
int d = 1;
}
int main() {
cin >> n;
abc(n);
return 0;
}
*
*
#include <iostream>
using namespace std;
void abc(int x) {
if (x == 2) {
return;
}
abc(x + 1);
int d = 1;
}
int main() {
abc(0);
return 0;
}
*
*
#include <iostream>
using namespace std;
int n;
int path[6];
void abc(int level) {
if (level == n)
{
for (int x = 0; x < level; x++) {
cout << path[x] << " ";
}
cout << endl;
return;
}
for (int x = 1; x <= 6; x++) {
path[level] = x;
abc(level + 1);
}
}
int main() {
cin >> n;
abc(0);
return 0;
}
- 체스판 참고
#include<iostream>
using namespace std;
char map[4][5]; // 디버깅용도
int used[4]; // 0 1 2 3 세로 라인사용여부
int cnt = 0;
int input;
void run(int y) {
if (y == input) {
cnt++;
return;
}
for (int x = 0; x < input; x++) {
if (used[x] == 1) continue;
used[x] = 1;// 사용함
map[y][x] = '#';
run(y + 1);
map[y][x] = '_';
used[x] = 0; // 원상복구
}
}
int main()
{
cin >> input;
for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) map[y][x] = '_'; }
run(0);
cout << cnt;
return 0;
}
'Algorithm > C++' 카테고리의 다른 글
[21.08.03] dat활용 counting sort와 vector사용법 (0) | 2021.08.03 |
---|---|
[21.08.02] 재귀함수2/ 백트래킹 (0) | 2021.08.02 |
[21.07.29]스택, 큐 (0) | 2021.08.01 |
[21.07.28] 문자열 파싱하기 (0) | 2021.08.01 |
[21.07.26~27] APS 시간복잡도, 배열 기초 (0) | 2021.07.31 |