回文数字
我用的是set自增有序造回文数字。
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <string.h> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 3000 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; set<string> nums[10]; void configureDigit(int x){ char ch[2]={0}; int i; if(x==1){ FF(i,10){ ch[0]=48+i; nums[1].insert(string(ch)); } }else if(x==2){ FF(i,10){ ch[0]=48+i; nums[2].insert(string(ch)+string(ch)); } }else{ set<string>& p=nums[x-2]; set<string>::iterator it=p.begin(); while(it!=p.end()){ string s=*it; FF(i,10){ ch[0]=48+i; nums[x].insert(string(ch)+s+string(ch)); } it++; } } } int eq=60; bool legal(string& s){ if(s[0]==48) return 0; int i,sum=0; FF(i,s.size()) sum+=s[i]-48; if(sum!=eq) return 0; return 1; } int main(){ I("%d",&eq); int i; bool ok=0; F(i,1,7) configureDigit(i); F(i,5,7){ set<string>::iterator it=nums[i].begin(); while(it!=nums[i].end()){ string s=*it; if(legal(s)){ puts(s.c_str()); ok=1; } it++; } } if(!ok) O("-1"); return 0; }