#include<iostream> #include<cstdio> #include<vector> using namespace std; vector<int> tiers; vector<int> actions; string tablica[6]={"A","B","C","D","E","F"}; string write(int ile, string text) { if(ile==0) { return ""; } if(ile==1) { return text; } if(actions[ile]>0) { if(text.length()==1 && ile<10) { return (to_string(actions[ile])+write(ile/actions[ile],text)); }else { return (to_string(actions[ile])+"["+write(ile/actions[ile],text)+"]"); } } if(actions[ile]<0) { return (write(ile+actions[ile],text) + write(-actions[ile],text)); } return "Error"; } string piramida(int n, int r) { if (n==0) return""; if(n==1) return (tablica[(0+r)%6]+tablica[(4+r)%6]+tablica[(2+r)%6]); string odp=""; int m=n/2; string pom=""; //middle pom +=write(m,tablica[(0+r)%6]); pom+=write(m-1,tablica[(4+r)%6]+tablica[(2+r)%6]); pom+=tablica[(4+r)%6]; odp+=write(n-m,pom); odp+=write(m,tablica[(0+r)%6]); //side odp+=piramida(n-m,r+2); //top odp+=write(m-1,tablica[(4+r)%6]+tablica[(2+r)%6]); odp+=tablica[(4+r)%6]; odp+=piramida(m-1,r); odp+=write(n-m+1,tablica[(2+r)%6]); return odp; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; tiers.push_back(0); actions.push_back(0); tiers.push_back(1); actions.push_back(0); for(int i=2;i<=9;i++) { tiers.push_back(1); actions.push_back(i); } int minimum=0; int action=0; for(int i=10;i<=n;i++) { action=-1; minimum= tiers[i-1]; for(int j=2;j<=9;j++) { if (tiers[i-j]<minimum) { minimum=tiers[i-j]; action=-j; } if(i%j==0) { if(tiers[i/j]<=minimum) { minimum=tiers[i/j]; action=j; } } } tiers.push_back(minimum+1); actions.push_back(action); } string odp=piramida(n,0); cout<<odp; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include<iostream> #include<cstdio> #include<vector> using namespace std; vector<int> tiers; vector<int> actions; string tablica[6]={"A","B","C","D","E","F"}; string write(int ile, string text) { if(ile==0) { return ""; } if(ile==1) { return text; } if(actions[ile]>0) { if(text.length()==1 && ile<10) { return (to_string(actions[ile])+write(ile/actions[ile],text)); }else { return (to_string(actions[ile])+"["+write(ile/actions[ile],text)+"]"); } } if(actions[ile]<0) { return (write(ile+actions[ile],text) + write(-actions[ile],text)); } return "Error"; } string piramida(int n, int r) { if (n==0) return""; if(n==1) return (tablica[(0+r)%6]+tablica[(4+r)%6]+tablica[(2+r)%6]); string odp=""; int m=n/2; string pom=""; //middle pom +=write(m,tablica[(0+r)%6]); pom+=write(m-1,tablica[(4+r)%6]+tablica[(2+r)%6]); pom+=tablica[(4+r)%6]; odp+=write(n-m,pom); odp+=write(m,tablica[(0+r)%6]); //side odp+=piramida(n-m,r+2); //top odp+=write(m-1,tablica[(4+r)%6]+tablica[(2+r)%6]); odp+=tablica[(4+r)%6]; odp+=piramida(m-1,r); odp+=write(n-m+1,tablica[(2+r)%6]); return odp; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; tiers.push_back(0); actions.push_back(0); tiers.push_back(1); actions.push_back(0); for(int i=2;i<=9;i++) { tiers.push_back(1); actions.push_back(i); } int minimum=0; int action=0; for(int i=10;i<=n;i++) { action=-1; minimum= tiers[i-1]; for(int j=2;j<=9;j++) { if (tiers[i-j]<minimum) { minimum=tiers[i-j]; action=-j; } if(i%j==0) { if(tiers[i/j]<=minimum) { minimum=tiers[i/j]; action=j; } } } tiers.push_back(minimum+1); actions.push_back(action); } string odp=piramida(n,0); cout<<odp; return 0; } |