题解 P2328 【[SCOI2005]超级格雷码】

此题似乎也可以不找规律。。。(因为我还是没看懂dalao说的奇偶性)
首先确定方向,思路为爆搜+去重,但是去重开销大,要去掉
所以方向确定为搜一次输出一次不判断
先从某状态(0000?)开始,先改一位的值(++ or --),到满就退一位(还是容易想的)
但退回去后如何保证后面的值不变呢?


首先可以确定的是,改的位的后一位一定达到边界(0 or B-1)
所以爆搜后一层的初始一定是0 or B-1!
交叉搜索奇偶判断就好啦!(感谢写SPJ的dalao)
最后是蒟蒻我的代码


#include<bits/stdc++.h>
using namespace std;
int n,B;
int num[110];
int dfs(int now,int check)
{
	if(now==n+1)
	{
		for(int i=1;i<=n;i++)
		{
			if(num[i]>9)
			{
				cout<<(char)(num[i]-10+'A');
			}
			else
			{
				cout<<num[i];
			}
		}
		cout<<endl;
		return 0;
	}
	if(check==0)
	{
		for(int i=0;i<B;i++)
		{
			num[now]=i;
			dfs(now+1,(i%2)?1:0);
		}
	}
	else
	{
		for(int i=B-1;i>=0;i--)
		{
			num[now]=i;
			dfs(now+1,(i%2)?0:1);
		}
	}
}
int main()
{
	cin>>n>>B;
	dfs(1,0);
} 
posted @ 2019-01-31 20:24  G_A_TS  阅读(525)  评论(0)    收藏  举报