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