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;
}


全部评论

相关推荐

野猪不是猪🐗:把你的学校加黑,加粗,斜体,下划线,描边,内阴影,内发光,投影,外发光,再上渐变色,居中,放大到最大字号,再把简历里其它内容删了,就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务