实在找不到哪里的策略还有问题
#include<bits/stdc++.h>
using namespace std;
int t,n,cnt=0;
map<int,vector<int>> mp;
vector<int> v;
vector<vector<int>> vv;
void fun(){
mp.insert({7,{8}});
mp.insert({6,{0,6,9}});
mp.insert({5,{2,3,5}});
mp.insert({4,{4}});
mp.insert({3,{7}});
mp.insert({2,{1}});
mp.insert({1,{-1}});
}
void dfs(int sx,int b){
if(b<=0){
if(b==0){
vector<int> t=v;
if(v[0]==0){
do{
vv.push_back(t);
}while(next_permutation(t.begin(),t.end()));
return;
}
vv.push_back(t);
cnt++;
}
return;
}
for(int i=sx;i>=2;i--){
for(auto j:mp[i]){
v.insert(v.begin(),j);
dfs(i-1,b-i);
v.erase(v.begin());
}
}
}
void func(){
if(n%7==0){
for(int i=1;i<=n/7;i++) printf("%d",8);
return;
}else{
v.clear();
vv.clear();
cnt=0;
if(n/7==0||n==7){
if(n==6) printf("%d\n",6);
else printf("%d\n",mp[n][0]);
return;
}
int a=n/7;
int b=n%7+7;
for(int i=1;i<=a-1;i++) v.insert(v.begin(),8);
// 14根木棍以内的分配
dfs(7,b);
if(cnt==0){
printf("%d\n",-1);
return;
}
sort(vv.begin(),vv.end(),[](vector<int> v1,vector<int> v2){
if(v1.size()==v2.size()){
for(int i=0;i<v1.size();i++){
if(v1[i]!=v2[i]){
return v1[i]<v2[i];
}
}
return true;
}else{
return v1.size()<v2.size();
}
});
for(int i=0;i<vv.size();i++){
if(vv[i][0]!=0){
for(auto j:vv[i]){
printf("%d",j);
}
printf("\n");
return;
}
}
return;
}
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
fun();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
func();
}
return 0;
}