Advertisement
Manioc

tecla&fode

Sep 7th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<int> neigh[10];
  6.  
  7. int _x[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
  8. int _y[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
  9.  
  10. long long soma, bagagem;
  11. int limit, cnt, atual, especial;
  12. vector<string> seq;
  13. bitset<10> vis;
  14.  
  15. bool check(int x, int  y){
  16.     return x >= 0 && x < 3 && y >= 1 && y <= 3;
  17. }
  18.  
  19. void build(){
  20.     neigh[0].push_back(7);
  21.     neigh[0].push_back(8);
  22.     neigh[0].push_back(9);
  23.     neigh[7].push_back(0);
  24.     neigh[8].push_back(0);
  25.     neigh[9].push_back(0);
  26.     for(int i = 0; i < 3; i++){
  27.         for(int j = 1; j <= 3; j++){
  28.             //cout << "Dad = " <<  i << " " << j << endl;
  29.             for(int k = 0; k < 8; k++){
  30.                 int x = i + _x[k];
  31.                 int y = j + _y[k];
  32.                 //cout << "Son = " << x << " " << y << endl;
  33.                 if(check(x, y)) {
  34.                     neigh[3*i + j].push_back(3*x + y);
  35.                 }
  36.             }
  37.         }
  38.     }
  39. }
  40.  
  41. string to_string(char valor){
  42.     string aux = "";
  43.     aux += valor;
  44.     return aux;
  45. }
  46. void digit(int no, int size, long long val, string form);
  47.  
  48. void contem(long long val, string form){
  49.     for(int i = 0; i < seq.size(); i++){
  50.         if(seq[i] == form) {
  51.             seq.erase(seq.begin()+i);
  52.             bagagem -= val;
  53.             break;
  54.         }
  55.     }
  56. }
  57.  
  58. void disseminar(int no, int size, long long val, string form){
  59.     for(int i = 0; i < neigh[no].size(); i++){
  60.         if(!vis[neigh[no][i]]) digit(neigh[no][i], size + 1, val*10 + neigh[no][i], form + to_string(neigh[no][i]+'0'));
  61.     }
  62.  
  63.     contem(val, form);
  64. }
  65.  
  66. void add(long long val, string form, int no, bool flag){
  67.     seq.push_back(form);
  68.     bagagem += val;
  69.  
  70.     if(bagagem == soma){
  71.         for(int i = 0; i < seq.size(); i++){
  72.             cout << seq[i] << " \n"[i == seq.size()-1];
  73.         }
  74.         cnt++;
  75.     }
  76.     if(flag) disseminar(no, 0, 0, "");
  77. }
  78.  
  79. void digit(int no, int size, long long val, string form){
  80.     if(val > soma) return;
  81.     vis[no] = true;
  82.     if(size == limit && val + bagagem <= soma){
  83.         add(val, form, no, true);
  84.         contem(val, form);
  85.     }else if(val+bagagem == soma){
  86.         add(val, form, no, false);
  87.         contem(val, form);
  88.     }else disseminar(no, size, val, form);
  89.     vis[no] = false;
  90. }
  91.  
  92. void print(){
  93.     for(int i = 0; i < 10; i++){
  94.         cout << "#" << i << " = ";
  95.         for(int j = 0; j < neigh[i].size(); j++) cout << neigh[i][j] << " \n"[j == neigh[i].size()-1];
  96.     }
  97. }
  98. int main(){
  99.     ios::sync_with_stdio(false);
  100.     cin.tie(NULL);
  101.     build();
  102.     int cases = 1;
  103.     while(true){
  104.         cin >> soma >> limit;
  105.         if(soma == -1 && limit == -1) break;
  106.         cout << "#" << cases++ << "\n";
  107.         cnt = 0;
  108.         vis.reset();
  109.         seq.clear();
  110.         for(atual = 0; atual <= 9;atual++){
  111.             bagagem = 0;
  112.             digit(atual, 1, atual, to_string('0'+atual));
  113.         }
  114.    
  115.         if(cnt == 0) cout << "impossivel\n";
  116.     }
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement