【USACO2.2.3】循环数

穷举出所有循环数,然后再判断。


穷举过程,其实VIS的判断还是可以用链表的形式,这样应该就0秒秒杀了~  现在是1ms …… BSOJ上只有一个0MS,是直接打表的……


#include <cstdio>
#include <algorithm>

bool vis[10]={0}, zhanyong[10]={0};
int TOT, n;
int q[10];
unsigned int a[480], tail=0;

inline void check()
{
	++ tail;
	for (int i = 0; i != TOT; ++ i)	a[tail] = a[tail]*10+q[i];
}

void dfs(int k, int usd) //当前在K的位置,  已经用了usd个数字 
{
	for (int i = 1; i != 10; ++ i)
	{
		if (vis[i])	continue;
		int will = (k + i) % TOT;
		if (will == k)	continue;
		if (zhanyong[will])
			if (!will && usd == TOT -1)
			{
				q[k] = i;
				check();
				continue;
			}else continue;
		vis[i] = 1;	
		zhanyong[will] = 1;
		q[k] = i;
		dfs(will, usd + 1);
		vis[i] = 0;
		zhanyong[will] = 0;	
	}

}

int main()
{
	zhanyong[0] = 1;
	for (TOT = 1; TOT <= 9; ++ TOT)	dfs(0, 0);
	std::sort(a + 1,  a + 1 + tail);
	scanf("%d", &n);
	for (int i = 1; i <= tail; ++ i)
		if (a[i] > n)
		{
			printf("%d", a[i]);
			return 0;
		}
}

不想写链表形式判断了…… 其实我还是更喜欢数组模拟链表来写, 直接写指针我真的写的很疵

你可能感兴趣的:(【USACO2.2.3】循环数)