p1008三连击,状压

有二进制位上的数记录1~9是否用过,因为一共放9次,所以如果有重复的,那么结果是8个1;
#include <bits/stdc++.h>

using namespace std;

int main(int argc, char** argv) {
	for(int i=123;i<=987/3;i++){
		int x=i, j=i<<1, k=i*3,flag=0;
		while(x) flag|=1<<x%10-1, x/=10;
		while(j) flag|=1<<j%10-1, j/=10;
		while(k) flag|=1<<k%10-1, k/=10;
		if(flag==(1<<9)-1) printf("%d %d %d\n",i,i<<1,i*3);
	} 
	return 0;
}


暴力
#include <bits/stdc++.h>

using namespace std;

int a[15];

bool isok(int x){
	for(int i=1,dig=100;i<=3;i++){
		if(a[x/dig]>=1) return false;
		a[x/dig]++;
		x%=dig;
		dig/=10;
	}
	return true;
}
void judge(int x){
	memset(a,0,sizeof a);

	if(isok(x)&&isok(x*2)&&isok(x*3)&&!a[0])//if(isok(x)&&isok(x*2)&&isok(x*3)) 共9位数所以a【0】==1必有一位为0 
		printf("%d %d %d\n",x,x*2,x*3);
}
int main(int argc, char** argv) {
	for(int i=1;i<=3;i++){
		for(int j=1;j<=9;j++){
			if(i*100+j*10>987/3) break;
			for(int k=1;k<=9;k++){
				if(i*100+j*10+k>987/3) break;
				judge(i*100+j*10+k);
			}
		}
	}
	return 0;
}


全部评论

相关推荐

09-01 11:31
门头沟学院 Java
buul:七牛云的吧,感觉想法是好的,但是大家没那么多时间弄他这个啊。。。不知道的还以为他是顶尖大厂呢还搞比赛抢hc,只能说应试者的痛苦考察方是无法理解的,他们只会想一出是一出
点赞 评论 收藏
分享
09-17 10:53
四川大学 C++
loveTy:你这些技能对大厂没用,而且四川大学因为之前地铁那个事件上了不少民营企业的黑名单。 去试一试国企,他们的黑名单没民营那么狠
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务