#include #include#include#include#include#include
using namespacestd;void help1(vector& count, intn) {string str =to_string(n);for (int i = 0; i
count[str[i]- '0']++;
}
}void help2(vector& count, intn) {string str =to_string(n);for (int i = 0; i
count[str[i]- '0']--;
}
}bool stop1(vector& num, vector&count) {for (int i = 0; i<10; i++) {if (count[i]
}return 1;
}bool stop2(vector& num, vector&count) {for (int i = 0; i<10; i++) {if (count[i] !=num[i])return 0;
}return 1;
}void backtrack3(vector& nums, vector& vis, int curSize, int&len,
vector& path, vector >&res) {if (curSize ==len) {//此时 path 已经保存了 nums 中的所有数字,已经成为了一个排列
res.push_back(path);return;
}for (int i = 0; i
if (i>0 && nums[i] == nums[i - 1] && vis[i - 1]) continue;
path.push_back(nums[i]);
vis[i]= true;
backtrack3(nums, vis, curSize+ 1, len, path, res);//刚开始接触回溯算法的时候常常会忽略状态重置//回溯的时候,一定要记得状态重置
path.pop_back();
vis[i]= false;
}
}
}
vector > permuteUnique(vector&nums) {
vector >res;int len =nums.size();if (len == 0) return{ {} };
sort(nums.begin(), nums.end());
vector vis(len, 0);
vectorpath;
backtrack3(nums, vis,0, len, path, res);returnres;
}bool input(vector&num) {intcur;bool sign = 0;if (cin >>cur) {
sign= 1;
num[0] =cur;for (int i = 1; i < 10; i++) {
cin>>num[i];
}
}returnsign;
}intmain() {
vector num(10);while(input(num)) {
vector count(10, 0); //记录1~N 所有数字出现的次数
int tar = 1;bool sign = 1;while (tar<=1000) {
help1(count, tar);if(stop1(num, count)) {
sign= 0;break;
}
tar++;
}if(sign) {
cout<< "NO ANSWER\n";continue;
}for (int i = 1; i <= tar; i++) {
vector count_temp =count;
help2(count_temp, i);if(stop2(num, count_temp)) {
cout<< tar << " " << i <
}
}/*vector number;
for (int i = 0; i<10; i++) {
if (num[i] < count[i]) {
for (int j = 0; j < count[i] - num[i]; j++) {
number.push_back(i);
}
}
}
vector > x_res = permuteUnique(number); //leetcode47
for (int i = 0; i
if (x_res[i][0] == 0) continue;
int x = 0;
for (int j = 0; j
x = x * 10 + x_res[i][j];
if (x>tar) break;
}
if (x <= tar) {
cout << tar << " " << x << endl;
}
}*/}return 0;
}