Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<int> neigh[10];
- int _x[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
- int _y[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
- long long soma, bagagem;
- int limit, cnt, atual, especial;
- vector<string> seq;
- bitset<10> vis;
- bool check(int x, int y){
- return x >= 0 && x < 3 && y >= 1 && y <= 3;
- }
- void build(){
- neigh[0].push_back(7);
- neigh[0].push_back(8);
- neigh[0].push_back(9);
- neigh[7].push_back(0);
- neigh[8].push_back(0);
- neigh[9].push_back(0);
- for(int i = 0; i < 3; i++){
- for(int j = 1; j <= 3; j++){
- //cout << "Dad = " << i << " " << j << endl;
- for(int k = 0; k < 8; k++){
- int x = i + _x[k];
- int y = j + _y[k];
- //cout << "Son = " << x << " " << y << endl;
- if(check(x, y)) {
- neigh[3*i + j].push_back(3*x + y);
- }
- }
- }
- }
- }
- string to_string(char valor){
- string aux = "";
- aux += valor;
- return aux;
- }
- void digit(int no, int size, long long val, string form);
- void contem(long long val, string form){
- for(int i = 0; i < seq.size(); i++){
- if(seq[i] == form) {
- seq.erase(seq.begin()+i);
- bagagem -= val;
- break;
- }
- }
- }
- void disseminar(int no, int size, long long val, string form){
- for(int i = 0; i < neigh[no].size(); i++){
- if(!vis[neigh[no][i]]) digit(neigh[no][i], size + 1, val*10 + neigh[no][i], form + to_string(neigh[no][i]+'0'));
- }
- contem(val, form);
- }
- void add(long long val, string form, int no, bool flag){
- seq.push_back(form);
- bagagem += val;
- if(bagagem == soma){
- for(int i = 0; i < seq.size(); i++){
- cout << seq[i] << " \n"[i == seq.size()-1];
- }
- cnt++;
- }
- if(flag) disseminar(no, 0, 0, "");
- }
- void digit(int no, int size, long long val, string form){
- if(val > soma) return;
- vis[no] = true;
- if(size == limit && val + bagagem <= soma){
- add(val, form, no, true);
- contem(val, form);
- }else if(val+bagagem == soma){
- add(val, form, no, false);
- contem(val, form);
- }else disseminar(no, size, val, form);
- vis[no] = false;
- }
- void print(){
- for(int i = 0; i < 10; i++){
- cout << "#" << i << " = ";
- for(int j = 0; j < neigh[i].size(); j++) cout << neigh[i][j] << " \n"[j == neigh[i].size()-1];
- }
- }
- int main(){
- ios::sync_with_stdio(false);
- cin.tie(NULL);
- build();
- int cases = 1;
- while(true){
- cin >> soma >> limit;
- if(soma == -1 && limit == -1) break;
- cout << "#" << cases++ << "\n";
- cnt = 0;
- vis.reset();
- seq.clear();
- for(atual = 0; atual <= 9;atual++){
- bagagem = 0;
- digit(atual, 1, atual, to_string('0'+atual));
- }
- if(cnt == 0) cout << "impossivel\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement