Advertisement
Manioc

F 2005

Sep 6th, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 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;
  12. vector<long long> seq;
  13. bitset<10> vis;
  14. map<long long, string> id;
  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. void digit(int no, int size, long long val, string &form);
  42.  
  43. void contem(int val){
  44.     for(int i = 0; i < seq.size(); i++){
  45.         if(seq[i] == val) {
  46.             seq.erase(seq.begin()+i);
  47.             bagagem -= val;
  48.             break;
  49.         }
  50.     }
  51. }
  52. void forNeigh(int no, long long valor){
  53.     vis[no] = true;
  54.     for(int i = 0; i < neigh[no].size(); i++){
  55.         int viz = neigh[no][i];
  56.         if(!vis[viz]){
  57.             string aux = "";
  58.             aux += (char)('0'+i);
  59.             digit(viz, 1, viz, aux);
  60.         }
  61.     }
  62.     vis[no] = false;
  63.     contem(valor);
  64. }
  65. void adiciona(long long valor, int cont, string &form){
  66.     if(valor + bagagem < soma){
  67.         bagagem += valor;
  68.         seq.push_back(valor);
  69.         id[valor] = form;
  70.         forNeigh(cont, valor);
  71.     }else if(valor + bagagem == soma){
  72.         bagagem += valor;
  73.         for(int i = 0; i < seq.size(); i++){
  74.             cout << " " << id[seq[i]];
  75.         }
  76.         printf("%lld\n", valor);
  77.         seq.push_back(valor);
  78.         id[valor] = form;
  79.         cnt++;
  80.         forNeigh(cont, valor);
  81.     }
  82. }
  83. void digit(int no, int size, long long val, string &form){
  84.     //cout << "--> " << val << endl;
  85.     if(size == limit) {
  86.         //cout << "limit\n";
  87.         vis[no] = true;
  88.         adiciona(val, no, form);
  89.         vis[no] = false;
  90.     }else if(val == soma-bagagem) {
  91.         //cout << "equal\n";
  92.         vis[no] = true;
  93.         adiciona(val, no, form);
  94.         vis[no] = false;
  95.     }else if(val+bagagem < soma){
  96.         vis[no] = true;
  97.         for(int i = 0; i < neigh[no].size(); i++){
  98.             int viz = neigh[no][i];
  99.             if(!vis[viz]){
  100.                 string aux = form;
  101.                 aux += (char)('0'+viz);
  102.                 digit(viz, size + 1, val*10 + viz, aux);
  103.             }
  104.         }
  105.         vis[no] = false;
  106.         contem(val);
  107.     }
  108. }
  109.  
  110. void print(){
  111.     for(int i = 0; i < 10; i++){
  112.         cout << "#" << i << " = ";
  113.         for(int j = 0; j < neigh[i].size(); j++) cout << neigh[i][j] << " \n"[j == neigh[i].size()-1];
  114.     }
  115. }
  116. int main(){
  117.     build();
  118.     print();
  119.     scanf("%lld %d", &soma, &limit);
  120.     cnt = 0;
  121.     vis.reset();
  122.     for(int i = 0; i <= 9;i++){
  123.         bagagem = 0;
  124.         seq.clear();
  125.         id.clear();
  126.         string aux = "";
  127.         aux += (char)('0'+i);
  128.         digit(i, 1, i, aux);
  129.     }
  130.  
  131.     if(cnt == 0) printf("impossivel\n");
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement