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

 

posted @ 2022-08-21 19:45  nichengmeibeiyong  阅读(28)  评论(0编辑  收藏  举报