블 루 브리지 컵 의 한 문제 dfs 가 요구 에 부 합 된 14 비트 정수 배열

현재 7 쌍 의 숫자 가 있 습 니 다. 두 개 1, 두 개 2, 두 개 3, 두 개 7. 한 줄 로 배열 하 세 요.
요구 하 는 것 은 두 개의 1 칸 에 다른 숫자 가 하나 있 고, 두 개의 2 칸 에 다른 숫자 가 2 개 있 는데, 이런 식 으로 유추 하면 두 개의 7 칸 에 7 개의 다른 숫자 가 있다.다음 과 같은 것 은 요구 에 부합 되 는 배열 이다.
 
17126425374635
 
물론 거꾸로 하면 요구 에 부합 한다.
 
요구 에 부합 되 는 또 다른 배열 법 을 찾 아 보 세 요. 그리고 이 배열 법 은 74 로 시작 합 니 다.
 
주의: 이 14 자리 의 정수 만 작성 하고 불필요 한 내용, 예 를 들 어 설명 주석 등 을 작성 할 수 없습니다.
dfs, 남 은 1, 2, 3, 5, 6, 5 개의 깊이 가 5 인 dfs 로 쓴 코드 가 틀 렸 는 지 모 르 겠 습 니 다. 어쨌든 마지막 에 하나 밖 에 출력 되 지 않 았 습 니 다. 모두 몇 개 있 는 지 모 르 겠 습 니 다. 어쨌든 하 나 를 찾 았 습 니 다.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int a[5] = {1, 2, 3, 5, 6};
int tem[14];
bool vis[10];

void dfs(int dep) {
	if (dep == 5) {
		for (int i = 0; i < 14; i++) {
			printf("%d", tem[i]);
		}
		puts("");
		return ;
	}
	for (int i = dep; i < 5; i++) {
		if (!vis[a[i]]) {
			for (int j = 0; j < 14; j++) {
				//      ,&&     
				if (tem[j] == 0 && j + a[i] + 1 < 14 && tem[j + a[i] + 1] == 0) {
					tem[j] = tem[j + a[i] + 1] = a[i];
					vis[a[i]] = true;
					dfs(dep + 1);
					vis[a[i]] = false;
					tem[j] = tem[j + a[i] + 1] = 0;
				}
			}
		}
	}
}

int main()
{
	memset(tem, 0, sizeof(tem));
	memset(vis, false, sizeof(vis));
	vis[4] = vis[7] = true;
	tem[8] = tem[0] = 7;
	tem[6] = tem[1] = 4;
	dfs(0);
	return 0;
}

결 과 는:
74151643752362

좋은 웹페이지 즐겨찾기