[NOIP1998 普及组] 三连击
生成九位一到九的全排列,按题目分割、过滤
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 bool vis[20]; 5 int queue[50]; 6 int answers[500]; 7 int cnt=0; 8 void search(int x) 9 { 10 for(int i=1;i<=9;i++)//每位数是1到9中的某一个 11 { 12 if(!vis[i])//每一个全排列都不会有重复的数字 13 //要有与之对应的标记、回溯和反标记 14 { 15 vis[i]=1; 16 queue[x]=i; 17 if(x>1) 18 search(x-1); 19 else 20 { 21 int num1=queue[1]*100+queue[2]*10+queue[3];//第一个三位数 22 int num2=queue[4]*100+queue[5]*10+queue[6];//第二个三位数 23 int num3=queue[7]*100+queue[8]*10+queue[9];//第三个三位数 24 if(num2==num1*2&&num3==num1*3)//符合题目要求的九位数 25 answers[cnt++]=num1; 26 } 27 vis[i]=0; 28 } 29 } 30 } 31 int main() 32 { 33 search(9);//生成九位某些数的全排列 34 std::sort(answers,answers+cnt); 35 for(int i=0;i<cnt;i++) 36 std::cout<<answers[i]<<" "<<answers[i]*2<<" "<<answers[i]*3<<std::endl; 37 }