题解 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);
}