Sicily 1845 Nine(全排列)

//思路,枚举一次全排列,将排列进行位数分割,然后判断,满足(B*D+C)/D是整数的答案放进答案数组里,注意这道题,B必须能整除C,一开始我以为只要满足假分数就可以 //结果WA了N次,预选赛做不出来的题总算把他过了 //数位分割的情况,1,5,3 1,4,4 2,4,3 注意2,3,4是不行的,虽然也会产生解,但它要求B必须整除C //我之前还补充了B=0的情况,结果又WA,我靠这道题真的不太好! //优化的思想体现在每全排列一个新的数串就进行判断,满足的话写进表里,这样的话只要1次全排列就得出了全部解 //最后再进行一次排序,将结果按要求排列 //一开始我是对每一个给定的数枚举一次全排列判断,结果超时 //另外要注意的就是格式化的输出了 #include<iostream> #include<algorithm> #include<cstring> using namespace std; int num[9] = {1,2,3,4,5,6,7,8,9}; int A,B,C,D; struct Ans { int b; int c; int d; }ans[101][50];//答案用结构体保存,方便排序 int cnt[101];//记录解得个数 void record(int a,int b,int c,int d) { int p = cnt[a]; ans[a][p].b = b; ans[a][p].c = c; ans[a][p].d = d; } bool cmp(Ans A,Ans B) { if(A.b != B.b) return A.b < B.b; else return A.c < B.c; }//自定义sort比较函数 int bit_len(int num)//返回一个数字有多少位,方便格式化输出 { int i = 0; while(num != 0) { num /= 10; ++i; } return i; } void print(int a)//格式化输出 { for(int i = 0;i < cnt[a];++i) { int len = bit_len(ans[a][i].c) + bit_len(a) + bit_len(ans[a][i].b) + 1; for(int j = 0;j < len - bit_len(ans[a][i].c);++j) printf(" ");printf("%d/n",ans[a][i].c); printf("%d=%d",a,ans[a][i].b); for(int j = 0;j < bit_len(ans[a][i].c);++j) printf("-");printf("/n"); for(int j = 0;j < len - bit_len(ans[a][i].d);++j) printf(" ");printf("%d/n",ans[a][i].d); } } int main() { memset(cnt,0,sizeof(cnt)); do { //分割数位方案 //1,5,3 B = num[0]; C = num[1]*10000 + num[2]*1000 + num[3]*100 + num[4]*10 + num[5]; D = num[6]*100 + num[7]*10 + num[8]; if(C % D == 0 && (B*D+C)/D <= 100) { A = (B*D+C)/D; record(A,B,C,D); cnt[A]++; } //1,4,4 B = num[0]; C = num[1]*1000 + num[2]*100 + num[3]*10 + num[4]; D = num[5]*1000 + num[6]*100 + num[7]*10 + num[8]; if(C % D == 0 && (B*D+C)/D <= 100) { A = (B*D+C)/D; record(A,B,C,D); cnt[A]++; } //2,4,3 B = num[0]*10 + num[1]; C = num[2]*1000 + num[3]*100 + num[4]*10 + num[5]; D = num[6]*100 + num[7]*10 + num[8]; if(C % D == 0 && (B*D+C)/D <= 100) { A = (B*D+C)/D; record(A,B,C,D); cnt[A]++; } }while(next_permutation(num,num+9));//利用全排列函数,方便 for(int i = 1;i <= 100;++i) sort(ans[i],ans[i] + cnt[i],cmp); while(scanf("%d",&A) && A != 0) { if(cnt[A]) print(A); else printf("impossible/n"); } return 0; } 

你可能感兴趣的:(Sicily 1845 Nine(全排列))