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