1. 程式人生 > >【bzoj3033】太鼓達人 DFS歐拉圖

【bzoj3033】太鼓達人 DFS歐拉圖

color 描述 。。 ret 所有 .html tdi style mic

題目描述

給出一個整數K,求一個最大的M,使得存在一個每個位置都是0或1的圈,圈上所有連續K位構成的二進制數兩兩不同。輸出最大的M以及這種情況下字典序最小的方案。

輸入

一個整數K。

輸出

一個整數M和一個二進制串,由一個空格分隔。表示可能的最大的M,以及字典序最小的排布方案,字符0表示關,1表示開。你輸出的串的第一個字和最後一個字是相鄰的。

樣例輸入

3

樣例輸出

8 00010111


題解

DFS歐拉圖

簡單學了一下深搜歐拉圖,感覺復雜度好玄學啊。。

帖一發 黃學長題解

把每個K-1位數看作點,添加1個字符看作邊,那麽就是求這個圖的歐拉回路,直接爆搜即可。

時間復雜度$O(2^k)$

#include <cstdio>
int n , m , vis[2050] , ans[2050];
bool dfs(int x , int k)
{
	if(vis[x]) return 0;
	if(k == m) return 1;
	ans[k] = x & 1 , vis[x] = 1;
	if(dfs((x << 1) & (m - 1) , k + 1)) return 1;
	if(dfs((x << 1 | 1) & (m - 1) , k + 1)) return 1;
	vis[x] = 0;
	return 0;
}
int main()
{
	int i;
	scanf("%d" , &n) , m = 1 << n;
	printf("%d " , m);
	dfs(0 , 1);
	for(i = 1 ; i < n ; i ++ ) printf("0");
	for(i = 1 ; i <= m - n + 1 ; i ++ ) printf("%d" , ans[i]);
	printf("\n");
	return 0;
}

【bzoj3033】太鼓達人 DFS歐拉圖